HBase 的原理和设计

 

HBase 架构跟笔者读研时做的分布式索引系统非常像,再一次体会到万变不离其宗!

 

以下为简单总结。

HDFS是个分布式文件系统,HBase本质是个数据分区管理系统,主要作用是管理数据分区,数据最终存到HDFS上。(你的分布式索引系统也是个数据分区管理系统)

功能上的主要概念:RowKey, Column Family, Column Qualifier, TimeStamp, KeyType

内部原理上主要概念:HRegion、HRegionServer、Store、MemStore、Store File(HFile)

 

是什么

HBase是基于HDFS的一个分布式列式数据库,常作为数据仓库,用于OLAP。其用于支持海量数据的快速写入存储、单RowKey数据查询和RowKey范围查询。

为什么写入快?主要有:【节点并行、数据分区并行】、【WAL及批量持久化】、【数据多版本即增删改在内部都是增故可追加写入】、【零拷贝等】。可见,类似于Kafka。其实写入速度快的分布式数据库几乎都是基于这些原理。

HBase架构

 

 

Zookeeper 用于存储系统元数据,包括节点列表和地址、数据分区信息、数据多副本的leader信息等。

RegionServer 是干活节点,负责数据存取等。

HMaster 用于监控RegionServer状态、进行数据分区的调整(Region的分配和调整)等。

Client 用于向系统发起读写数据,会从Zookeeper取得分区元数据后定位到HRegion,从而与HRegionServer通信。

DataNode是HDFS中的存储节点。

数据模型

本质是一个KV数据库,Key由 (RowKey, Column Family, Column Qualifier, TimeStamp, KeyType) 组成、而Value就是实际上的值。

RowKey在写入数据时生成,唯一,在表中按字典序排序

Column Family、Column Qualifier分别为列族、列,每个列族下可有任意个列且不同行所包含的列可不一样;

TimeStamp是由数据库自动生成的时间戳,表示数据的版本,每次增删改同一行数据都将产生新版本;

KeyType 为"Delete"表示数据被删除;

数据分区策略(数据写入过程)

 

一个表的数据根据 RowKey 横向分区,分成多个HRegion上,这些HRegion分到不同的RegionServer上,每个HRegion有startKey、endKey记录标识本Region内数据的RowKey范围。

一个HRegion上有多个Store,一列族内的数据存储在一起,每个列族用一个Store存(所以我们可以说HBase是基于列族存储的);

数据写Store时是用WAL策略写:写内存MemStore+写磁盘HLog 就返回,MemStore攒一定数据量再批量append写磁盘HFile。

由上可见,HBase对数据分区策略很简单,是先水平分再垂直分区——先按RowKey、再按ColumnFamily分区的,即先按RowKey分成不同的HRegion、对于一个HRegion内的数据再按不同ColumnFamily分成不同Store。(与笔者的分布式索引系统中索引space的切分很像)

其数据写入过程和LSM tree的非常像,实际上内部就用了LSM tree。

数据查询(RowKey设计)

支持三种查询:全表扫描、根据RowKey查一条数据、根据RowKey范围进行范围查询。
查询时的执行流程与上面写入的类似,根据RowKey确定HRegion、根据HRegion确定HRegionServer、去HRegionServer查询。
需要根据业务上的查询场景设计RowKey,通常是进行字段拼接;通常预先知道RowKey的范围以根据范围进行分区分布到不同HRegion上。
可进行一些优化提高查询效率,比如记录每个HRegion内key的范围、每个HRegion用布隆过滤器记录一个key在其内是否出现。这些都是常用的技术点,LSM tree中就有这些优化点的实现。

使用

hbase shell

常用的操作命令有create,describe,disable,drop,list,scan,put,get,delete,deleteall,count,status等,通过help可以看到详细的用法。

 

参考资料

HBase的原理和设计https://zhuanlan.zhihu.com/p/145551967

 

posted @ 2016-09-22 19:23  March On  阅读(250)  评论(0编辑  收藏  举报
top last
Welcome user from
(since 2020.6.1)