(大数据分析-3)HBASE Review

来源:互联网 发布:人工智能学校排名 编辑:程序博客网 时间:2024/05/16 17:23


1 HBASE基本原理及介绍

1.1 基本原理

1.1.1 HBASE基本概念

  1. HBASE特点
    • 多版本并发控制,数据随机读写操作,数据强一致性
      • 数据多版本:每个单元中的数据可以有多个版本,通过timestamp区别
      • 数据类型单一:所有数据都是byte数组,没有类型
    • 稀疏、分布式、持久、多维有序map
      • 稀疏:空(null)列不占存储空间,表可以非常稀疏
      • 分布式:视图其他行没有关系,可以横切为多个region,分别部署在多个节点
      • 多维度:5个维度,row key、column family、column、value、timestamp
      • 有序:不管hbase跨多少机器,row key都是有序(B+树索引结构,支持快速定位)
  2. 基本概念
    名词含义 表tableHbase以表为单位组织数据。 行row表中数据以行为单位,byte[]存储。  RowKey相当于额外的列,是每条记录的主键。  各行数据按RowKey排序,用于快速查找。 列族column family各行数据列族相同,但不是每个列族中都需要有数据。 列限定符Column Qualifier一个列族拥有一或多列数据,各行数据列不需要相同。 单元格Cell行、列族和列限定符的组合指定的单元格。  单元格存放的数据成为单元格的值,没有类型,byte[]存储。 时间戳Timstamp单元格的值可以有多个版本,各个版本由版本号区分。  默认版本号为值被写入的时间戳。 
  3. HBASE逻辑视图


    组织方式:多级索引,按row key升序,按timestamp降序

     keykeykeykey key valuerow keycolumn familycolumn qualifiertimestampvalue

    Hbase逻辑视图如下:


  4. 物理模型 v.s. 数据模型
    • HBASE物理模型
      • table中所有行按RowKey排序
      • 单个table一开始只有一个region
      • 随着记录越来越多,单个region太大,达到阈值,分裂成2个region(region split)
      • region是Hbase中分布式存储和负载的最小单元
      • 不同region分布在不同的RegionServer上


    • HBASE数据模型


  5. 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不再是单点故障
  6. HBASE物理存储


    物理结构功能 storeHRegion虽然是分布式存储的最小单元,但不是存储的最小单元  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恢复-hlogHLog是一个实现Write Ahead Log类,每次写MemStore前写入HLog  每个RegionServer维护一个HLog  HLog定期删除旧的文件(已经持久化到HFile的数据) Hbase恢复-RegionServer意外中止HMaster通过ZooKeeper感知  处理HLog,针对不同的Region拆分Log数据  重新分配失效region  通过HLog信息重新写进MemStore,然后flush到HFile 


  7. 读写流程
    • Hbase写流程
      • Client向RegionServer提交请求
      • 找到目标region
      • 数据更新先写进MemStore和HLog中,保持有序
      • MemStore达到阈值,创建新的MemStore,并将老的添加进flush队列,有单独的线程flush到磁盘的StoreFile
      • 当StoreFile达到阈值进行合并compact,形成大的StoreFile
      • StoreFile大小达到阈值进行分裂split,等分成两个region
    • Hbase读流程
      • 通过三层结构寻找对应的region
      • 先在MemStore中查找
      • 建立storeHeap堆,从对应region下的所有StoreFile寻找
  8. 索引

    Rowkey作为索引,字典排序。当通过rowkey不再满足应用的需求,如select * from table where col=val,建立二级索引加速查找


  9. 数据库设计理论:
    • 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 shellHBase Shell; enter 'help<RETURN>' for list of supported commands.Type "exit<RETURN>" to leave the HBase ShellVersion 0.98.6-transwarp, r14622, Wed Aug 12 16:26:42 CST 2015hbase(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 - table1hbase(main):002:0> listTABLE                                                                           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 secondshbase(main):004:0> put 'table1','row1123','family1:name','BILL'0 row(s) in 0.0090 secondshbase(main):005:0> put 'table1','row1','family1:sex','male'0 row(s) in 0.0130 secondshbase(main):006:0> put 'table1','row2','family1:name','Lily'0 row(s) in 0.0100 secondshbase(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 secondshbase(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 secondshbase(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 secondshbase(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 secondshbase(main):013:0> deleteall 'table1','row1'0 row(s) in 0.0210 secondshbase(main):021:0> listTABLE                                                                           0 row(s) in 0.0160 seconds=> []

0 0