本文将详细地介绍 HBase MOB 的使用,本指南适合入门的开发者。
将不同大小的文件(比如图片、文档等)存储到 HBase 非常的简单方便。从技术上来说,HBase 可以直接在一个单元格(Cell)存储大小到10MB的二进制对象。然而,HBase 正常的读写路径仅仅对小于 100KB 的值进行了优化;当 HBase 处理大量大小到 10MB 的二进制对象时,由于分割(splits)和压缩(compactions)引起的写放大(write amplification),会导致性能的下降。
一种解决这个问题的办法是将大于 100KB 的对象直接存储到 HDFS,然后将这些文件的引用直接存储在 HBase 中,这就是本文介绍的 MOB 特性,详见 HBASE-11339。本文仅仅简单地介绍 MOB 的使用,关于 MOB 的具体实现请自行Google,或直接阅读相关源码。
为了使用 MOB,你必须将 HFile 的版本设置为 3,如下
<property>
<name>hfile.format.versionname>
<value>3value>
property>
我们可以通过 HBase Shell 在创建表或者直接修改已有表的属性。我们还可以通过 HBase 的 Java API 来设置,具体如下。
通过 HBase Shell
hbase> create 'iteblog', {NAME => 'f', IS_MOB => true, MOB_THRESHOLD => 102400}
或
hbase> alter 'iteblog', {NAME => 'f', IS_MOB => true, MOB_THRESHOLD =>102400}
其中
通过 Java API
HColumnDescriptor hcd = new HColumnDescriptor("f");
hcd.setMobEnabled(true);
hcd.setMobThreshold(102400L);
因为随时都可能存在大量 MOB 文件,与 HFiles 的数量相比,MOB 文件并不总是保持打开状态。 MOB文件读取器缓存是 LRU 缓存,它将最近使用的 MOB 文件保持打开状态。下面参数用于调整 HBase MOB 缓存。
<property>
<name>hbase.mob.file.cache.sizename>
<value>1000value>
<description>
缓存打开文件句柄的个数。如果该值设置的比较大,cache 可以缓存更多的文件句柄,
从而降低打开关闭文件的频率。但是如果该值设置过大会导致打开的文件句柄数过多。
默认值是:“1000”。此参数在服务端 ResionServer 上配置。
description>
property>
<property>
<name>hbase.mob.cache.evict.periodname>
<value>3600value>
<description>
MOB cache 回收缓存的 Mob 文件的周期,默认是3600s。
description>
property>
<property>
<name>hbase.mob.cache.evict.remain.rationame>
<value>0.5fvalue>
<description>
MOB cache 回收之后保留的文件个数占cache容量个数的比例,当缓存的文件
个数超过 hbase.mob.file.cache.size 设置的值之后会触发Mob cache 回收。
description>
property>
HBase 提供了一个 Java 实用程序
以帮助测试 MOB 功能并为您的情况决定适当的配置值。 该实用程序运行如下:
$ sudo -uiteblog hbase org.apache.hadoop.hbase.IntegrationTestIngestMOB \
-threshold 102400 \
-minMobDataSize 512 \
-maxMobDataSize 5120
其中
为了能够手动压缩 MOB 文件,HBASE-13012 中引入了 compact_mob 和 major_compact_mob 命令用于手动触发 MOB 文件的压缩,而不是等到相应的配置时间。这些命令中的每一个参数都是表名,第二个可选参数为列族名。如果指定了列族名,则仅压缩该列族的文件。否则将压缩所有启用 MOB 的列族文件。
hbase> compact_mob 'iteblog'
hbase> compact_mob 'iteblog', 'f'
hbase> major_compact_mob 'iteblog'
hbase> major_compact_mob 'iteblog', 'f'
同时,我们也可以使用 Admin 类中提供的 API 进行压缩:
void compact(TableName tableName)
void compact(TableName tableName, byte[] columnFamily)
void majorCompact(TableName tableName)
void majorCompact(TableName tableName, byte[] columnFamily)
为了能够移除那些没有引用的 MOB 或者将小文件合并成大的文件,HBase 在 HBASE-11644 中引入了一个叫做 sweep tool 的清洁者,其内部使用的是 MapReduce。这个功能涉及到的参数如下
<property>
<name>hbase.mob.sweep.tool.compaction.rationame>
<value>0.5fvalue>
<description>
如果一个 MOB 文件中,未被删掉的 Cell 大小总和占该 MOB 文件
大小的百分比小于该比例,该 MOB 文件被看作是一个无效的文件,
需要合并。此参数在客户端配置。
description>
property>
<property>
<name>hbase.mob.sweep.tool.compaction.mergeable.sizename>
<value>134217728value>
<description>
如果 MOB 文件的大小小于该值,该文件被认为是一个小文件需要合
并。默认值是128MB。此参数在客户端配置。
description>
property>
<property>
<name>hbase.mob.sweep.tool.compaction.memstore.flush.sizename>
<value>134217728value>
<description>
扫描作业使用的 memstore 的刷新大小。 每个 sweep reducer
都拥有一个memstore。默认值是128MB。此参数在客户端配置。
description>
property>
<property>
<name>hbase.master.mob.ttl.cleaner.periodname>
<value>86400value>
<description>
ExpiredMobFileCleanerChore 的执行周期,以秒为单位。默认值是
一天(86400秒)。注意:如果生存时间值过期了,即文件从创建起已经
超过了24小时,则 MOB 文件将会被过期mob文件清理工具删除。
description>
property>
转载至
https://www.iteblog.com/archives/2441.html