什么是Hbase?
Apache HBase是基于Hadoop构建的一个分布式的、可伸缩的海量数据存储系统。HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)提供的容错能力。它是Hadoop的生态系统,提供对数据的随机实时读/写访问,是Hadoop文件系统的一部分。人们可以直接或通过HBase的存储HDFS数据。使用HBase在HDFS读取消费/随机访问数据。 HBase在Hadoop的文件系统之上,并提供了读写访问。
Hbase与HDFS
Hbase数据模型
每个HBase的table存储的结果大致如下表所示:
在qualifier之上还有个层级column family,相比传统的RDB多了一个层级。一些概念解释如下:
用来表示唯一一行记录的主键,HBase的数据是按照RowKey的字典顺序进行全局排序的,所有的查询都只能依赖于这一个排序维度。HBase的RowKey天生自带索引,并且按字节顺序排列,而且天然分布式。因此设计RowKey就成了用好HBase的关键。可以把RowKey想象中SQL语句中SELECT col FROM htable WHERE (condition);其中的condition,用HBase之前务必先设计好查询条件,将WHERE条件的语句作为RowKey存储。
区别于Cassandra/DynamoDB的”Hash分区”设计,HBase中采用了”Range分区”,将Key的完整区间切割成一个个的”Key Range” ,每一个”Key Range”称之为一个Region。也可以这么理解:将HBase中拥有数亿行的一个大表,横向切割成一个个”子表“,这一个个”子表“就是Region。Region是HBase中负载均衡的基本单元,当一个Region增长到一定大小以后,会自动分裂成两个。
如果将Region看成是一个表的横向切割,那么,一个Region中的数据列的纵向切割,称之为一个Column Family。每一个列,都必须归属于一个Column Family,这个归属关系是在写数据时指定的,而不是建表时预先定义。
适用场景
HBase的数据模型比较简单,数据按照RowKey排序存放,适合HBase存储的数据,可以简单总结如下:
以实体为中心的数据实体可以包括但不限于如下几种:
- 自然人/账户/手机号/车辆相关数据
- 用户画像数据(含标签类数据)
- 图数据(关系类数据)
描述这些实体的,可以有基础属性信息、实体关系(图数据)、所发生的事件(如交易记录、车辆轨迹点)等等。
以事件为中心的数据:
- 监控数据
- 时序数据
- 实时位置类数据
- 消息/日志类数据
上面所描述的这些数据,有的是结构化数据,有的是半结构化或非结构化数据。HBase的“稀疏矩阵”设计,使其应对非结构化数据存储时能够得心应手,但在我们的实际用户场景中,结构化数据存储依然占据了比较重的比例。由于HBase仅提供了基于RowKey的单维度索引能力,在应对一些具体的场景时,依然还需要基于HBase之上构建一些专业的能力,如:
- OpenTSDB 时序数据存储,提供基于Metrics+时间+标签的一些组合维度查询与聚合能力
- GeoMesa 时空数据存储,提供基于时间+空间范围的索引能力
- JanusGraph 图数据存储,提供基于属性、关系的图索引能力
HBase擅长于存储结构简单的海量数据但索引能力有限,而Oracle等传统关系型数据库(RDBMS)能够提供丰富的查询能力,但却疲于应对TB级别的海量数据存储,HBase对传统的RDBMS并不是取代关系,而是一种补充。
集群角色ZooKeeper
在一个拥有多个节点的分布式系统中,假设,只能有一个节点是主节点,如何快速的选举出一个主节点而且让所有的节点都认可这个主节点?这就是HBase集群中存在的一个最基础命题。利用ZooKeeper就可以非常简单的实现这类”仲裁”需求,ZooKeeper还提供了基础的事件通知机制,所有的数据都以 ZNode的形式存在,它也称得上是一个”微型数据库”。
NameNode
HDFS作为一个分布式文件系统,自然需要文件目录树的元数据信息,另外,在HDFS中每一个文件都是按照Block存储的,文件与Block的关联也通过元数据信息来描述。NameNode提供了这些元数据信息的存储。
DataNode
HDFS的数据存放节点。
RegionServer
HBase的数据服务节点。
Master
HBase的管理节点,通常在一个集群中设置一个主Master,一个备Master,主备角色的”仲裁”由ZooKeeper实现。 Master主要职责:
- 负责管理所有的RegionServer
- 建表/修改表/删除表等DDL操作请求的服务端执行主体
- 管理所有的数据分片(Region)到RegionServer的分配
- 如果一个RegionServer宕机或进程故障,由Master负责将它原来所负责的Regions转移到其它的RegionServer上继续提供服务
- Master自身也可以作为一个RegionServer提供服务,该能力是可配置的