文章目录
《Apache HBase中等对象存储MOB压缩分区策略介绍》 文章中介绍了 MOB 的一些压缩实现,并提及了一些 MOB 的一些简单使用,本文将详细地介绍 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.version</name> <value>3</value> </property>
在 HBase 表中使用 MOB
我们可以通过 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}
其中
- IS_MOB:是一个 Boolean 值选项,指定当前列族是否启用 MOB 功能;
- MOB_THRESHOLD:指定多大的对象当做 MOB 来存储,单位为字节。如果你没有指定 MOB_THRESHOLD 的值,默认是 100KB;也就是说如果你在 HBase 中写入的对象大于这个尺寸,这个对象就会被当做 MOB 来处理。
通过 Java API
HColumnDescriptor hcd = new HColumnDescriptor("f"); hcd.setMobEnabled(true); hcd.setMobThreshold(102400L);
HBase MOB 缓存相关参数
因为随时都可能存在大量 MOB 文件,与 HFiles 的数量相比,MOB 文件并不总是保持打开状态。 MOB文件读取器缓存是 LRU 缓存,它将最近使用的 MOB 文件保持打开状态。下面参数用于调整 HBase MOB 缓存。
<property> <name>hbase.mob.file.cache.size</name> <value>1000</value> <description> 缓存打开文件句柄的个数。如果该值设置的比较大,cache 可以缓存更多的文件句柄, 从而降低打开关闭文件的频率。但是如果该值设置过大会导致打开的文件句柄数过多。 默认值是:“1000”。此参数在服务端 ResionServer 上配置。 </description> </property> <property> <name>hbase.mob.cache.evict.period</name> <value>3600</value> <description> MOB cache 回收缓存的 Mob 文件的周期,默认是3600s。 </description> </property> <property> <name>hbase.mob.cache.evict.remain.ratio</name> <value>0.5f</value> <description> MOB cache 回收之后保留的文件个数占cache容量个数的比例,当缓存的文件 个数超过 hbase.mob.file.cache.size 设置的值之后会触发Mob cache 回收。 </description> </property>
测试 MOB 存储和检索性能
HBase 提供了一个 Java 实用程序 org.apache.hadoop.hbase.IntegrationTestIngestMOB
,以帮助测试 MOB 功能并为您的情况决定适当的配置值。 该实用程序运行如下:
$ sudo -uiteblog hbase org.apache.hadoop.hbase.IntegrationTestIngestMOB \ -threshold 102400 \ -minMobDataSize 512 \ -maxMobDataSize 5120
其中
- threshold Cell 大小达到多少阈值就认为是 MOB,默认是 1 kB,单位是字节。
- minMobDataSize MOB 数据大小的最小值. 默认为 512 B,单位是字节。
- maxMobDataSize MOB 数据大小的最大值. 默认为 5K,单位是字节。
手动压缩 MOB 文件
为了能够手动压缩 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 Sweeper
为了能够移除那些没有引用的 MOB 或者将小文件合并成大的文件,HBase 在 HBASE-11644 中引入了一个叫做 sweep tool 的清洁者,其内部使用的是 MapReduce。这个功能涉及到的参数如下
<property> <name>hbase.mob.sweep.tool.compaction.ratio</name> <value>0.5f</value> <description> 如果一个 MOB 文件中,未被删掉的 Cell 大小总和占该 MOB 文件 大小的百分比小于该比例,该 MOB 文件被看作是一个无效的文件, 需要合并。此参数在客户端配置。 </description> </property> <property> <name>hbase.mob.sweep.tool.compaction.mergeable.size</name> <value>134217728</value> <description> 如果 MOB 文件的大小小于该值,该文件被认为是一个小文件需要合 并。默认值是128MB。此参数在客户端配置。 </description> </property> <property> <name>hbase.mob.sweep.tool.compaction.memstore.flush.size</name> <value>134217728</value> <description> 扫描作业使用的 memstore 的刷新大小。 每个 sweep reducer 都拥有一个memstore。默认值是128MB。此参数在客户端配置。 </description> </property> <property> <name>hbase.master.mob.ttl.cleaner.period</name> <value>86400</value> <description> ExpiredMobFileCleanerChore 的执行周期,以秒为单位。默认值是 一天(86400秒)。注意:如果生存时间值过期了,即文件从创建起已经 超过了24小时,则 MOB 文件将会被过期mob文件清理工具删除。 </description> </property>本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【HBase MOB(Medium Object)使用入门指南】(https://www.iteblog.com/archives/2441.html)