(大数据分析-3)HBASE Review
hbase原理回顾
·
1 HBASE基本原理及介绍
1.1 基本原理
1.1.1 HBASE基本概念
- HBASE特点
- 多版本并发控制,数据随机读写操作,数据强一致性
- 数据多版本:每个单元中的数据可以有多个版本,通过timestamp区别
- 数据类型单一:所有数据都是byte数组,没有类型
- 稀疏、分布式、持久、多维有序map
- 稀疏:空(null)列不占存储空间,表可以非常稀疏
- 分布式:视图其他行没有关系,可以横切为多个region,分别部署在多个节点
- 多维度:5个维度,row key、column family、column、value、timestamp
- 有序:不管hbase跨多少机器,row key都是有序(B+树索引结构,支持快速定位)
- 多版本并发控制,数据随机读写操作,数据强一致性
- 基本概念
名词 含义 表table Hbase以表为单位组织数据。 行row 表中数据以行为单位,byte[]存储。 RowKey相当于额外的列,是每条记录的主键。 各行数据按RowKey排序,用于快速查找。 列族column family 各行数据列族相同,但不是每个列族中都需要有数据。 列限定符Column Qualifier 一个列族拥有一或多列数据,各行数据列不需要相同。 单元格Cell 行、列族和列限定符的组合指定的单元格。 单元格存放的数据成为单元格的值,没有类型,byte[]存储。 时间戳Timstamp 单元格的值可以有多个版本,各个版本由版本号区分。 默认版本号为值被写入的时间戳。 - HBASE逻辑视图
组织方式:多级索引,按row key升序,按timestamp降序
key key key key key value row key column family column qualifier timestamp value Hbase逻辑视图如下:
- 物理模型 v.s. 数据模型
- HBASE物理模型
- table中所有行按RowKey排序
- 单个table一开始只有一个region
- 随着记录越来越多,单个region太大,达到阈值,分裂成2个region(region split)
- region是Hbase中分布式存储和负载的最小单元
- 不同region分布在不同的RegionServer上
- HBASE数据模型
- HBASE物理模型
- HBASE架构
组件 功能 HMaster 管理用户对table的创建删除修改操作 为Region server分配region 负责Region server的负载均衡 发现失效的Region server并重新分配其上的region(通过zookeeper实现) 不负责实际数据操作 Region Server 维护region,处理对这些region的IO请求,直接与client进行数据通信 负责切分(split)在运行过程中变得过大的region 对region进行compact操作 在运行中可以动态添加、删除 Client 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息 ZooKeeper 通过选举,保证任何时候,集群中只有一个HMaster HMaster与RegionServer启动时会向ZooKeeper注册 存贮所有Region的寻址入口 实时监控Region server的上线和下线信息。并实时通知给HMaster 存储HBase的schema和table元数据,如column family Zookeeper的引入使得Master不再是单点故障 - HBASE物理存储
物理结构 功能 store HRegion虽然是分布式存储的最小单元,但不是存储的最小单元 HRegion由多个store组成,每个store保存一个Column Family 每个store由1个MemStore和0到多个StoreFile组成 MemStore存储在内存中 StoreFile存储在HDFS上,底层称为HFile compact 把小的HFile合并成大的,减少HFile数量,提升读效率 执行时严重影响HBase性能 触发后不能停止 Minor Compact 把多个HFile合成一个 Major Compact 一个store下的所有文件合并 删除过期版本数据 删除delete marker数据 指定间隔时间或手动执行 splitling 当region中的数据过大时,触发splitting。 用middle key分割成两个相邻region。速度很快,毫秒级。可以手动触发。 真正split:创建现有HFile的引用文件,未真正分开;Compaction时才重写数据。 hmaster容错 多个HMaster,同一时间只有一个active HMaster失效,由ZooKeeper选择另一个HMaster 无Hmaster过程中: 1)读操作正常进行,因为region信息还在 2);region切分、负载均衡无法进行 Region Server容错 定时向Zookeeper汇报心跳 超时则HMaster将该RegionServer上的Region重新分配到其他RegionServer Hbase恢复-hlog HLog是一个实现Write Ahead Log类,每次写MemStore前写入HLog 每个RegionServer维护一个HLog HLog定期删除旧的文件(已经持久化到HFile的数据) Hbase恢复-RegionServer意外中止 HMaster通过ZooKeeper感知 处理HLog,针对不同的Region拆分Log数据 重新分配失效region 通过HLog信息重新写进MemStore,然后flush到HFile
- 读写流程
- Hbase写流程
- Client向RegionServer提交请求
- 找到目标region
- 数据更新先写进MemStore和HLog中,保持有序
- MemStore达到阈值,创建新的MemStore,并将老的添加进flush队列,有单独的线程flush到磁盘的StoreFile
- 当StoreFile达到阈值进行合并compact,形成大的StoreFile
- StoreFile大小达到阈值进行分裂split,等分成两个region
- Hbase读流程
- 通过三层结构寻找对应的region
- 先在MemStore中查找
- 建立storeHeap堆,从对应region下的所有StoreFile寻找
- Hbase写流程
- 索引
Rowkey作为索引,字典排序。当通过rowkey不再满足应用的需求,如select * from table where col=val,建立二级索引加速查找
- 数据库设计理论:
- ACID理论:原子性、持久性、一致性、隔离性
- CAP理论:一致性、可用性、网络隔离性。对每个集群选择PA或PC
- hbase选择一致性(行一致性)、网络隔离性,任何时候网络副本都一样,放弃可用性。即一旦发生网络隔离,在返回失败错误。
- 部分数据库(对一致性不高)选择可用性、网络隔离性,放弃一致性。如google搜索网页,返回较旧的网页。
hbase按row key范围横切(就是region),第1台机器 hbase的row key不要用递增序列、递减序列,如关系型数据库里面的时间等,会导致写入热 点问题(集群部分写入的机器只有1台)
二级索引,创建二级倒排表。 hbase是无字符类型数据库,全部按照二进制内容。索引只有两列,值和位置
1.2 相关指令
创建hbase表table1,column family为family1,row key以10、20划分3段
[root@hadoop1 ~]# hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.98.6-transwarp, r14622, Wed Aug 12 16:26:42 CST 2015
hbase(main):001:0> create 'table1','family1',SPLITS=>['10','20']
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/lib/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
0 row(s) in 2.4820 seconds
=> Hbase::Table - table1
hbase(main):002:0> list
TABLE
table1
tablexf
2 row(s) in 0.0310 seconds
=> ["table1", "tablexf"]
插入数据,column分别为name、sex
hbase(main):003:0> put 'table1','row1','family1:name','BILL'
0 row(s) in 0.1950 seconds
hbase(main):004:0> put 'table1','row1123','family1:name','BILL'
0 row(s) in 0.0090 seconds
hbase(main):005:0> put 'table1','row1','family1:sex','male'
0 row(s) in 0.0130 seconds
hbase(main):006:0> put 'table1','row2','family1:name','Lily'
0 row(s) in 0.0100 seconds
hbase(main):007:0> put 'table1','row2','family1:sex','female'
0 row(s) in 0.0110 seconds
打印table1
hbase(main):008:0> scan 'table1' //打印所有记录
ROW COLUMN+CELL
row1 column=family1:name, timestamp=1442298988538, value=BILL
row1 column=family1:sex, timestamp=1442299027575, value=male
row1123 column=family1:name, timestamp=1442299025041, value=BILL
row2 column=family1:name, timestamp=1442299027641, value=Lily
row2 column=family1:sex, timestamp=1442299032441, value=female
3 row(s) in 0.1860 seconds
hbase(main):009:0> scan 'table1',{LIMIT=>1}
ROW COLUMN+CELL
row1 column=family1:name, timestamp=1442298988538, value=BILL
row1 column=family1:sex, timestamp=1442299027575, value=male
1 row(s) in 0.0390 seconds
hbase(main):010:0> scan 'table1',{LIMIT=>1,STARTROW=>'row2'}
ROW COLUMN+CELL
row2 column=family1:name, timestamp=1442299027641, value=Lily
row2 column=family1:sex, timestamp=1442299032441, value=female
1 row(s) in 0.0200 seconds
删除记录,row key为row1123;删除表table1
hbase(main):011:0> delete 'table1','row1123','family1:name'
0 row(s) in 0.0580 seconds
hbase(main):012:0> scan 'table1'
ROW COLUMN+CELL
row1 column=family1:name, timestamp=1442298988538, value=BILL
row1 column=family1:sex, timestamp=1442299027575, value=male
row2 column=family1:name, timestamp=1442299027641, value=Lily
row2 column=family1:sex, timestamp=1442299032441, value=female
2 row(s) in 0.0410 seconds
hbase(main):013:0> deleteall 'table1','row1'
0 row(s) in 0.0210 seconds
hbase(main):021:0> list
TABLE
0 row(s) in 0.0160 seconds
=> []
更多推荐
所有评论(0)