HBase是一个构建在HDFS上的分布式列存储系统,基于Google BigTable模型开发的,是典型的key/value系统。支持海量结构化数据存储、横向扩展、高可用
2. hbase数据模型hbase以表的方式在HBase存储数据的。表是由行和列构成的,所有的列是从属于某一个列族的。行和列的交叉点称之为cell,cell是版本化的。cell的内容是不可分割的字节数组。
表的行键也是一段字节数组,所以任何东西都可以保存进去,不论是字符串或者数字。HBase的表是按key排序的,排序方式之针对字节的。所有的表都必须要有主键-key.
2.1 概念视图我们可以将一个表想象成一个大的映射关系,通过行健、行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,HBase是稀疏存储数据的,因此某些列可以是空白的。每个单元称作cell
下图演示了hbase中定义的一张表的逻辑视图。可以看到同样的key根据时间戳可以有不同的版本。某些cell可以为空。

根据hbase的逻辑视图以及官方资料我们可以总结出hbase表的一些特点:
写支持行级锁 空cell不占用空间,表可以是稀疏表,不会造成存储空间浪费 cell的内容是不可分割的字节数组,不区分类型 一个列名是由它的列族前缀和修饰符(qualifier)连接而成。例如上图c1表示列族,冒号后面接修饰符。 每一张表有一个固定的列族集合。修改列族集合需要修改表结构;列修饰符可以随意修改 相同的key值hbase会保存一定数量的版本,默认用时间戳来区分,读取的时候,列族和列修饰符都相同,则默认选最新的(列族相同,修饰符不同则还是会都显示的)。 2.2 物理视图虽然从概念视图来看每个表格是由很多行组成的,但是在物理存储上面,它是按照列来保存的。例如上图中的key=r1相关的行按照列族c1和c2不同,在物理上分成两部分存储,如下图:


总结:
HBase 为每个值维护了多级索引,即: 存储优化都是针对列族级别的,这就意味着,一个colimn family的所有成员的是用相同的方式访问的 在物理上,一个的列族成员在文件系统上都是存储在一起 2.3 hbase物理存储结构 Table在行的方向上分割为多个Region;
Region按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region;

Region是Hbase中分布式存储和 负载均衡的最小单元 ,不同Region分布到不同RegionServer上。

Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile包含HFile(StoreFile是HFile的轻量级包装);memStore存储在内存中,StoreFile存储在HDFS上。

2.4 列族的设计原则

每个列族都会MemStore和BlockCache,数据在硬盘中以HFile形式存储。HFile不会存储跨列族的数据。
因此,根据上图可以得出,HBase表中列族设计的原则是:
同一个列族里存储相似访问模式的所有有数据。可以理解为关系数据库中一对一关系,一对一关系的两张表,在HBase中可以存储在一张表中,放到不同的列族。 大多数的表,设计一个列族就够了。在HBase中,高表比宽表性能好,可以设计多张表来满足需求。总结:1张表1个列族最好
3. hbase基本架构
3.1 client
包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息
3.2 master为Region server分配region
负责Region server的负载均衡
发现失效的Region server并重新分配其上的region
管理用户对table的增删改查操作
3.3 Region ServerRegionserver维护region,处理对这些region的IO请求
Regionserver负责切分在运行过程中变得过大的region
3.4 zookeeper通过选举,保证任何时候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册
存贮所有Region的寻址入口
实时监控Region server的上线和下线信息。并实时通知给Master
存储HBase的schema和table元数据
默认情况下,HBase 管理ZooKeeper 实例,比如, 启动或者停止ZooKeeper
Zookeeper的引入使得Master不再是单点故障
4. 高可用 4.1 Write-Ahead-Log(WAL)保障数据高可用
该机制用于数据的容错和恢复:
每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复
4.2 组件高可用 Master容错:Zookeeper重新选择一个新的Master。如果无Master过程中,数据读取仍照常进行,但是,region切分、负载均衡等无法进行; RegionServer容错:定时向Zookeeper汇报心跳,如果一旦时间内未出现心跳,Master将该RegionServer上的Region重新分配到其他RegionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的RegionServer Zookeeper容错:Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例 5. HBASE与HDFS对比两者都具有良好的容错性和扩展性,都可以扩展到成百上千个节点;
HDFS适合批处理场景,但是不支持数据随机查找、不适合增量数据处理、不支持数据更新
参考资料:
hbase官方网站