文章目录
- 10.1 HBase 架构
- 10.2 Hbase数据存储结构
- 10.3 HBase 工作流程
- 1. 读流程
- 2. 写流程
- 3. 数据 Flush 流程
- 10.4 HBase 和 Hive
- 10.5 RowKey 设计
10.1 HBase 架构
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。
10.2 Hbase数据存储结构
在 HBase 表的列族(column family)中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
10.3 HBase 工作流程
1. 读流程
HBase 中有一个系统表 hbase:meta 存储 HBase 元数据信息,meta 表主要是记录保存了每个表的 Region 地址,表中的每一行对应一个 Region 的起始地址和结束地址。这个 meta 表肯定示由一个 HRegionServer 来管理 。
从整体的方面看,如下图所示
2. 写流程
Hbase 的写数据比读数据要快,因为 HBase 将数据写入到内存 Mem Store 后,就直接返回给客户端写入成功,响应非常快。
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