HBase详细介绍及原理解析!( 六 )


写操作:
首先从 ZooKeeper 找到 hbase:meta 表的 Region 位置,然后读取 hbase:meta表中的数据 , hbase:meta 表中存储了用户表的 Region 信息 。
根据 namespace 、表名和 rowkey 信息找到写入数据对应的 Region 信息 。
找到这个 Region 对应的 RegionServer,然后发送请求 。
把数据分别写到 HLog (WriteAheadLog)和 MemStore 各一份 。
MemStore 达到阈值后把数据刷到磁盘,生成 StoreFile 文件 。
删除 HLog 中的历史数据 。

HBase详细介绍及原理解析!

文章插图
BulkLoad机制用户数据位于 HDFS 中,业务需要定期将这部分海量数据导入 HBase 系统,以执行随机查询更新操作 。
这种场景如果调用写入 API 进行处理,极有可能会给 RegionServer 带来较大的写人压力 。
  • 引起 RegionServer 频繁 flush,进而不断 compact、split,影响集群稳定性 。
  • 引起 RegionServer 频繁GC,影响集群稳定性 。
  • 消耗大量 CPU 资源、带宽资源、内存资源以及 IO 资源 , 与其他业务产生资源竞争 。
  • 在某些场景下,比如平均 KV 大小比较大的场景,会耗尽 RegionServer 的处理线程, 导致集群阻塞 。
所以HBase提供了另一种将数据写入HBase集群的方法:BulkLoad 。
BulkLoad 首先使用 MapReduce 将待写入集群数据转换为 HFile 文件 , 再直接将这些 HFile 文件加载到在线集群中 。
BulkLoad 没有将写请求发送给 RegionServer 处理,可以有效避免上述一系列问题 。
常见问题热点问题什么是热点?
检索 HBase 的记录首先要通过Row Key来定位数据行 。
当大量的 Client 访问 HBase 集群的一个或少数几个节点,造成少数 Region Server 的读/写请求过多、负载过大,而其他Region Server 负载却很小 , 就造成了 热点 现象 。
解决方案:
预分区:
  • 目的让表的数据可以均衡的分散在集群中,而不是默认只有一个Region分布在集群的一个节点上 。
加盐:
  • 在Rowkey的前面增加随机数 , 具体就是给Rowkey分配一个随机前缀以使得它和之前的Rowkey的开头不同 。
哈希:
  • 哈希会使同一行永远用一个前缀加盐 。
  • 也可以使负载分散到整个集群,但是读是可以预测的 。
  • 使用确定的哈希可以让客户端重构完整的Rowkey,可以使用get操作准确获取某一个行数据 。
反转:
  • 反转固定长度或者数字格式的Rowkey 。
  • 这样可以使得Rowkey中经常改变的部分放在前面 。




推荐阅读