HBase MOB(Medium Object)使用入门指南

本文将详细地介绍 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 表中使用 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.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>

测试 MOB 存储和检索性能

HBase 提供了一个 Java 实用程序
在这里插入图片描述以帮助测试 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.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

你可能感兴趣的:(Hbase博文)