文章目录

  • 10.1 HBase 架构
  • 10.2 Hbase数据存储结构
  • 10.3 HBase 工作流程
  • 1. 读流程
  • 2. 写流程
  • 3. 数据 Flush 流程
  • 10.4 HBase 和 Hive
  • 10.5 RowKey 设计


10.1 HBase 架构

hadoop zookeeper hbase关系 hbase组件中zookeeper的主要功能_Hive


HBase 也是 Master/Slaves 架构,由一个 HMaster 和多个 HRegionServer 构成。

从上图中能看出 HBase 是由 Client、ZooKeeper、HMaster、HRegionServer、HDFS 等几个组件组成,组件的相关功能:

1. Zookeeper:

HBase 通过 ZooKeeper 来实现 HMaster 的高可用、HRegionServer 的监控、元数据的入口以及集群配置的维护等工作。它具体工作如下:

  • 通过 ZoopKeeper 来保证集群中只有 1 个 HMaster 在运行,如果 HMaster异常,会通过竞争机制产生新的 HMaster 提供服务。
  • 通过 ZoopKeeper 来监控 HRegionServer 的状态,当 HRegionSevrer 有异常的时候,通过 HMaster的消息通知,获取HRegionServer 上下线的信息。
  • 通过 ZoopKeeper 存储元数据的统一入口地址

2. HMaster

HMaster 节点的主要职责如下:

  • 监 控 HRegionServer ,处理 HRegionServer 故 障 转 移 , 当 某 个HRegionServer 挂掉时,ZooKeeper 会将分配在该 HRegionServer 上的 HRegion 分配到其他 HRegionServer 上进行管理。
  • HRegion 分裂后,负责新的 HRegion 的分配。
  • 处理元数据的变更,比如对表的创建、添加,修改,删除等操作。
  • 在空闲时间进行数据的负载均衡,主要就是在 HRegionServer 间迁移HRegion,达到负载均衡。
  • 通过 ZooKeeper 发布自己的位置给客户端。

3. HRegionServer

HRegionServer 直接负责用户的读写请求,是真正的干活的节点。它的功能概括如下:

  • 负责和底层 HDFS 的交互,存储数据到 HDFS,HBase 是依托于 HDFS的 NoSQL 数据库,数据会存储在 HDFS 上。
  • 处理分配给它的 HRegion。
  • 刷新缓存到 HDFS。
  • 维护 HLog,HLog 是一个容错机制。
  • 处理来自客户端的读写请求。HRegionServer 是实际管理数据的,所以客户端的读写请求最终都要由 HRegionServer 来处理。
  • 负责处理 HRegion 变大后的拆分。
  • 负责 StoreFile 的合并工作。

4. HLog

Write-Ahead Logs 也叫预写日志,在 HBase 中为 HLog,HLog 存储在 HDFS 上。

为什么存在要有预写日志呢?其实跟 HBase 架构设计有关,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)

但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据在写入内存之前会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。需要注意的是,HLog 是每一个 RegionServer 对应一个

5. HRegion

HRegion 可以看成是表的横向切分,HBase 表的分片,HBase 每个表都会根据 RowKey 值被切分成不同的 HRegion 分散存储在 HRegionServer 中,在一个HRegionServer 中可以有多个不同的 HRegion。这些 HRegion 可以是来自不同的表。HRegion、Table、HRegionServer 关系如下面的图所示。

值得注意的是,一个 HRegion 只能在一个 HRegionServer 上,不能跨多个HRegionServer

hadoop zookeeper hbase关系 hbase组件中zookeeper的主要功能_HDFS_02


10.2 Hbase数据存储结构

在 HBase 表的列族(column family)中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

hadoop zookeeper hbase关系 hbase组件中zookeeper的主要功能_数据_03


10.3 HBase 工作流程

1. 读流程

HBase 中有一个系统表 hbase:meta 存储 HBase 元数据信息,meta 表主要是记录保存了每个表的 Region 地址,表中的每一行对应一个 Region 的起始地址和结束地址。这个 meta 表肯定示由一个 HRegionServer 来管理

hadoop zookeeper hbase关系 hbase组件中zookeeper的主要功能_Hive_04


从整体的方面看,如下图所示

hadoop zookeeper hbase关系 hbase组件中zookeeper的主要功能_数据_05


2. 写流程

Hbase 的写数据比读数据要快,因为 HBase 将数据写入到内存 Mem Store 后,就直接返回给客户端写入成功,响应非常快。

hadoop zookeeper hbase关系 hbase组件中zookeeper的主要功能_Hive_06


3. 数据 Flush 流程

从上面写入数据的流程中可以看出,HBase 写数据是写入到 MemStore 内存就会返回客户端了,并没有直接落磁盘。这也是为什么 HBase 插入数据会比较快的原因,磁盘 IO 非常小。

那么什么时候数据会落磁盘呢?其实 MemStore 空间是有限的,当 MemStore 数据达到阈值(默认是 128M,老版本是 64M),RegionServer 将数据刷到 HDFS 上,生成 HFile,然后将内存中的数据删除,同时删除 HLog 中的历史数据。该操作是由 RegionServer 自己完成的。


10.4 HBase 和 Hive

Hive是一种类SQL的引擎,并且运行 MapReduce 任务,Hbase是一种在 HDFS 之上的 NoSQL 的 Key/value 数据库。

  • Hive 适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive 不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。
  • Hbase 非常适合用来进行大数据的实时查询。Facebook 用 Hbase 进行消息和实时的分析。它也可以用来统计 Facebook 的连接数。

10.5 RowKey 设计

RowKey 可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在 HBase 内部,RowKey 保存为字节数组 byte[]。存储时,数据按照 RowKey 的字典顺序排序存储。设计 RowKey 时,要充分利用排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)。

一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个 Region 取决于 rowkey 处于哪个一个预分区的区间内,设计 rowkey 的主要目的 ,就是让数据均匀的分布于所有的 region 中,在一定程度上防止数据倾斜。下面rowkey 常用的设计方案。

1. 生成随机数、hash值

比如:
原本 rowKey 为 1001 的,SHA1 后变成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7
原本 rowKey 为 3001 的,SHA1 后变成:49042c54de64a1e9bf0b33e00245660ef92dc7bd
原本 rowKey 为 5001 的,SHA1 后变成:7b61dec07e02c188790670af43e717f0f46e8913

2. 字符串反转

20170524000001 转成 10000042507102
20170524000002 转成 20000042507102

3. 字符串拼接

20170524000001_a12e
20170524000001_93i7