HBase實戰之MOB使用指南

HBase實戰之MOB使用指南
HBase可以很方便的將圖片、文本等文件以二進制的方式進行存儲。雖然HBase一般可以處理從1字節到10MB大小的二進制對象,但是HBase通常對於讀寫路徑的優化主要是針對小於100KB的值。當HBase處理數據爲100KB~10MB時,由於分裂(split)和壓縮(compaction)會引起寫的放大,從而會降低HBase性能。所以在HBase2.0+引入了MOB特性,這樣保持了HBase的高性能、強一致性和低開銷。

若要啓用MOB功能,需要在每個RegionServer進行配置,並在建表或者修改表時對指定列族啓用MOB特性。在HBase嚐鮮版中啓用MOB功能,需要由admin用戶設置定期進程,以重新優化MOB數據的分佈。

啓用和配置RegionServer上的MOB特性

增加或者修改hbase-site.xml文件中的某些配置

1 設置MOB文件的緩存配置

<property>
    <name>hbase.mob.file.cache.size</name>
    <value>1000</value>
</property>

<property>
    <name>hbase.mob.cache.evict.period</name>
    <value>3600</value>
</property>

<property>
    <name>hbase.mob.cache.evict.remain.ratio</name>
    <value>0.5f</value>
 </property>

說明:

1)hbase.mob.file.cache.size 打開的文件句柄緩存數,默認值是1000。通過增加文件句柄數可以提高讀的性能,可以減少頻繁的打開、關閉文件。若這個值設置過大,會導致“too many opened file handers”。

2)hbase.mob.cache.evict.period MOB緩存淘汰緩存的MOB文件時間間隔(以秒爲單位),默認值爲3600秒。

3)hbase.mob.cache.evict.remain.ratio 當緩存的MOB文件數目超過hbase.mob.file.cache.size設置的數目後,會觸發MOB緩存淘汰機制(eviction),0.5f爲剩餘的MOB緩存比率(0~1),默認的比率爲0.5f。
2 配置MobMasterObserver作爲協處理器的master,主要用於表在刪除後,MOB文件的歸檔。

<property>
   <name>hbase.coprocessor.master.classes</name>
   <value>org.apache.hadoop.hbase.coprocessor.MobMasterObserver </value>
</property>

MOB的管理MOB特性爲HBase引入新的讀寫路徑,此時我們採用外部工具對其進行優化處理,一個是expiredMobFileCleanerTTL處理TTL和時間的過期數據,另一個是清理工具用來合併小的MOB文件或者多次更新、刪除的MOB文件。

a . 清理過期的MOB數據(expiredMobFileCleaner)

org.apache.hadoop.hbase.mob.compactions.expiredMobFileCleaner tableName familyName

設置清理延時

<property>
    <name>hbase.mob.cleaner.delay</name>
    <value>60 * 60 * 1000</value>
</property>
  1. 清理工具
org.apache.hadoop.hbase.mob.compactions.Sweeper tableName familyName

屬性值設置如下:

<property>
    <name>hbase.mob.compaction.invalid.file.ratio</name>
    <value>0.3f</value>
</property>

<property>
    <name>hbase.mob.compaction.small.file.threshold</name>
    <value>67108864</value>
</property>

<property>
    <name>hbase.mob.compaction.memstore.flush.size</name>
    <value>134217728</value>
</property>

說明:

1)hbase.mob.compaction.invalid.file.ratio 如果在MOB文件中刪除了太多的單元格,則被視爲作爲無效文件,需要重新寫入或者合併。當MOB文件(mobFileSize)大小減去存在的單元格(existingCellsSize)大小之差除以MOB文件(mobFileSize)的比率小於設定的值時,我們就認爲其爲無效文件。默認值爲0.3f。

2)hbase.mob.compaction.small.file.threshold 如果MOB的大小小於閾值,則視爲小文件,需要合併。默認值爲64MB。

3) hbase.mob.compaction.memstore.flush.size MOB裏memstore大小,超過此大小就會flush,並且每個sweep reducer擁有各自memstore。

警告:

使用清理工具最壞的情況:MOB文件壓縮合併成功,但是相關的(put)更新失敗。這意味着新的MOB文件已經創建但未能將新的MOB文件路徑存入HBase中,因此HBase不會指向這些MOB文件。

小貼士:請檢查yarn-site.xml的配置,在yarn.application.classpath中添加hbase的安裝路徑:$HBASE_HOME/ 和hbase的lib路徑: $HBASE_HOME/lib/

<property>
    <description>Classpath for typical applications.</description>
     <name>yarn.application.classpath</name>
     <value>
      $HADOOP_CONF_DIR
        $HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*
        $HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
        $HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*
        $HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/* 
        $HBASE_HOME/*, $HBASE_HOME/lib/*
    </value>
</property>

在表中開啓MOB特性a 將列族設置爲MOB

HColumnDescriptor hcd = new HColumnDescriptor(“f”);
hcd.setValue(MobConstants.IS_MOB, Bytes.toBytes(Boolean.TRUE));

b 設置MOB單元格的閾值,默認爲102400

HColumnDescriptor hcd;
hcd.setValue(MobConstants.MOB_THRESHOLD, Bytes.toBytes(102400L);

對於客戶端而言,MOB單元格操作和普通單元格類似。

c 插入MOB值

KeyValue kv = new KeyValue(row1, family, qf1, ts, KeyValue.Type.Put, value );
Put put = new Put(row1);
put.add(kv);
region.put(put);

d 獲取MOB值

Scan scan = new Scan();
InternalScanner scanner = (InternalScanner) region.getScanner(scan);
scanner.next(result, limit);

e 獲取MOB 所有數據(raw =true)

Scan scan = new Scan();
scan.setAttribute(MobConstants.MOB_SCAN_RAW, Bytes.toBytes(Boolean.TRUE));
InternalScanner scanner = (InternalScanner) region.getScanner(scan);
scanner.next(result, limit);

運行一個MOB示例

sudo -u hbase hbase org.apache.hadoop.hbase.IntegrationTestIngestMOB

原文鏈接:http://hbase.group/article/95

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章