本文系转载,如有侵权,请联系我:likui0913@gmail.com

Compacation

HBase 在读写的过程中,难免会产生无效的数据以及过小的文件,比如:MemStore 在未达到指定大小便刷新数据以写入到磁盘;或者当已经写入 HFile 的数据被删除后,原数据被标记了墓碑,却仍然存在于 HFile 之中。在这些情况之下,我们需要清除无效的数据或者合并过小的文件来提高读的性能。这种合并的过程也被称为 compacation。

HBase 中使用的 compacation 方式主要分为以下两种:

  • Minor_compaction
  • Major_compaction

Minor_Compaction

HBase 会自动选择一些较小的 HFile,并将它们重写成更少的但更大的 HFiles 文件,这个过程被称为 minor_compaction。minor_compaction 通过将少量的相邻的 HFile 合并为单个 HFile 来达到压缩操作,但是它不会删除被标记为删除或过期的数据。

Major_Compaction

Major_Compaction 将 Region 中的所有 HFile 合并并重写成一系列由列族(Column Family)组成的 HFile 文件,并在此过程删除已被删除或已过期的数据。这会提高读取性能,但是由于 Major_compaction 会重写所有文件,所以在此过程中可能会发生大量的磁盘 I/O 和网络流量,这种现象被称为写入放大(write amplification)。

Region Split

最初,每一个 table 都会有一个 Region。随着数据的不断写入,当这个 Region 变得太大时,它就会被分裂成两个子 Regions。两个子 Regions 各种拥有原 Region 的一半,它们会在相同的 RegionServer 上并行打开,然后将分区信息报告给 HMaster。处于负载均衡的原因,HMaster 可能会将新的 Region 移动到其它服务器。

负载均衡

Split 最初发生在同一个 RegionServer 上,但是出于负载均衡的原因,HMaster 可能会将新的 Region 移动到其它服务器(移动元数据,而不是 HFile 文件)。这会导致新的 RegionServer 提供来自远程 HDFS 节点的数据,直到 Major_compaction 时将数据文件移动到区域服务器的本地节点。

故障恢复

WAL 文件和 HFile 被保存在磁盘上并被复制,但是 MemStore 还没有被保存在磁盘上,所以当 RegionServer 发生问题后,HBase 是如何恢复 MemStore 之中的数据呢?

当 RegionServer 失败时,崩溃的 Region 将不可用,直到检查并恢复之后方可继续使用。Zookeeper 会在失去 RegionServer 心跳时确定节点故障,HMaster 将会被通知 RegionServer 已经失败。

注:当 RegionServer 失败时,正在查询该节点上的数据的操作会被重试,并且不会立即丢失。

当 HMaster 检测到 RegionServer 已经崩溃时,HMaster 会将已崩溃的 RegionServer 上的 Regions 重新分配给活动的 RegionServer。为了恢复已崩溃的 RegionServer 上未刷新到磁盘的 MemStore 中的内容,HMaster 将属于崩溃的 RegionServer 的 WAL 文件拆分成单独的文件,并将这些文件存储在新的 RegionServer 的 DataNode 上。然后新的 RegionServer 根据拆分后的 WAL 文件重播 WAL,以重建丢失的 MemStore 区域。

WAL 重播

WAL 文件包含编辑列表,一个编辑表示单个操作的 put 或者 delete。编辑按照时间顺序写入,并将附加到存储在磁盘上的 WAL 文件的末尾。

如果数据仍在 MemStore 中并且未保存到 HFile 中时,将发生 WAL 重播。WAL 重播是通过读取 WAL 文件,将其包含的编辑操作添加到当前的 MemStore 并进行排序来完成的。

参考链接

最新文章

  1. hdu 1251 统计难题 (字典树入门题)
  2. javascript设计模式实践之策略模式--输入验证
  3. Hibernate断网修改配置文件实现正常验证运行
  4. [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列
  5. sharepoint读取启用了追加功能的多行文本的历史版本记录
  6. JDK安装和配置
  7. 选择符优先级-----:link伪类
  8. 2015 NOIP day2 t2 信息传递 tarjan
  9. 解决VS2008闪退的问题
  10. 免解压版的Mysql的启动脚本,并且执行导入(windows)
  11. DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表
  12. JAVA项目复习的一些小细节
  13. docker 安装 msyql
  14. Install and run DB Query Analyzer 6.04 on Microsoft Windows 10
  15. CentOS 7 安装Git
  16. java 访问数据库
  17. MySQL--更新自增列的潜在风险
  18. java.net.ProtocolException:unexpected end of stream
  19. Python2.7更新pip:UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position 7: ordinal not in range(128)
  20. Snmp学习总结系列——开篇

热门文章

  1. oracle中查找锁定状态的用户
  2. sklearn常见分类器的效果比较
  3. Gitlab+Jenkins学习之路(四)之gitlab备份和恢复
  4. P1402 酒店之王
  5. Flutter - Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
  6. CSS盒模型 flex
  7. MySQL事务及其实现
  8. SNMP TRAP报文解析
  9. Received non-all-whitespace CHARACTERS or CDATA event in nextTag(). ,无法整齐打印验证错误。 解析XML文档出现的问题
  10. React Native移动开发实战-4-Android平台的适配原理