HBase入门

概述

HBase是一个构建在HDFS上的分布式列存储系统,基于Google BigTable模型开发,典型的key/value系统,是Apache Hadoop生态系统中重要的一员,主要用于海量非结构化和半结构化的松散数据,它的目标是依靠横向扩展,通过不断增加廉价的商用服务器来增加计算和存储能力。

HBase表的特点

  • 大:一个表可以有数十亿行、上百万列
  • 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态地增加,同一张表中不同的行可以有截然不同的列
  • 面向列:面向列(族)的存储和权限控制,列(族)独立检索
  • 稀疏:空列不占用存储空间,表可以非常稀疏
  • 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳
  • 数据类型单一:HBase的数据都是字符串,没有类型

HBase基本概念

  • RowKey:是Byte array,是表中每条记录的主键,方便快速查找,RowKey设计非常重要。
  • Column Family:列族,拥有一个名称(string),包含一个或者多个相关列,列族是表的schema的一部分,必须在使用之前定义,访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览全部或者部分数据。
  • Version Number: 类型为Long, 默认值是系统时间戳,可由用户自定义。为了避免数据存在过多版本造成的管理(包括存贮和索引)负担,hbase提供了两种数据版本回收方式:一是保存数据最后N个版本,二是保存最近一段时间内控版本。
  • Value(Cell):Byte array

HBase物理模型

每个Column family存储在HDFS上的一个单独文件中,空值不会被保存,Key和Version Number在每个Column Family中都有一份。HBase为每个值维护了多级索引,即: 
1. Table中所有行都按照row key的字典序排列 ;
2. Table中行的方向上分割为多个Region ;
3. Region按大小分割,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阈值时,region会等分成两个新的region,之后会有越来越多的region ;
4. Region是HBase中分布式存储和负载均衡的最小单元,不同的region分布到不同的RegionServer上;
5. Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个Store保存一个columns family;每个Store又由一个memStore和0至多个StoreFile组成,StoreFile包含,memStore存储在内存中,StoreFile存储在HDFS上。 
6. HBase写操作是锁行的,每一行都是一个原子元素,无论对行进行访问的事务设计多少列,对行的更新都是原子的,都可以加锁,这使得加锁模型简单化 。

HBase基本组件说明

  • Client 
    包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region位置信息。
  • Master
    1. 为Region Server分配region
    2. 负责Region Server的负载均衡
    3. 发现失效的Region Server并重新分配其上的region
    4. 管理用户对table的增删改查
  • Region Server
    1. RegionServer维护region,处理对这些region的IO请求
    2. RegionServer负责切分运行过程中变大的region
  • Zookeeper的作用
    1. 通过选举保证任何时候集群中只有一个master,Master与RegionServer启动时会向Zookeeper注册;
    2. 存贮所有Region寻址入口;
    3. 实时监控Region Server的上线和下线信息,并实时通知Master;
    4. 存储HBase的schema和table元数据;
    5. 默认情况下,HBase管理Zookeeper实例,比如启动或者停止Zookeeper;
    6. Zookeeper的引入使得Master不再是单点故障。
  • Write-Ahead-Log(WAL)
    主要用于数据的容错与恢复 
    每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写入一份到HLog文件中,HLog文件会定期滚动出新的,并删除旧的文件 ,当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应的region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史的HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

HBase的容错性

Master容错:Zookeeper重新选择一个新的Master

  • 无Master过程中,数据读取仍照常进行
  • 无Master过程中,region切分、负载均衡等无法进行

RegionServer容错:定时向Zookeeper汇报心跳,如果一段时间内未出现心跳,Master将该RegionServer上的Region重新分配到其它RegionServer上,失效服务器上预写日志由主服务器进行分割并派送给新的RegionServer。

Zookeeper容错:Zookeeper是一个可靠的服务,一般配置3或5个Zookeeper实例。

Region定位的流程: 
  寻找RegionServer 
  ZooKeeper --> -ROOT- --> .META. --> 用户表

 -ROOT- 
  该表包含.META.表所在的region列表,该表只会有一个Region, Zookeeper中记录了-ROOT-表的location。

 .META. 
  表包含所有用户空间region列表,以及RegionServer的服务器地址。

HBase使用场景

  • 大数据量存储,高并发操作
  • 需要对数据随机读写操作
  • 读写访问均是非常简单的操作

HBase与HDFS对比

  • 两者都具有良好的容错性与扩展性,都可以扩展到成百上千个节点
  • HDFS适合批处理场景
  • 不支持数据随机查找
  • 不适合增量数据处理
  • 不支持数据更新

Schema设计

  • Column Family数据最好为1
  • Key的设计避免单调递增,最小化
  • 最小化Column

参考

  • 非常详细的HBase读写流程:http://wenku.baidu.com/view/232ecca10029bd64783e2cfa.html?re=view
分享到: