HBase中存取圖片、文檔數據(HBase MOB)

Hbase MOB介紹

HBase一般存取小於10K的數據性能很好,若是文件稍大點,好比中等文件的大小,大小在100K<10M之間,因爲壓縮會帶來性能降低,會致使region不可用。php

爲了解決這個問題,HBase引入了對中等大小文件的支持,也就是Hbase MOB(The Moderate Object Storage)特性,或者叫Hbase對象存儲。詳見HBase-11339html

關於HBase MOB的介紹,能夠參考一下幾篇文章:shell

這個特性在HBase 2.0.0版本才被合入,因爲如今仍是Beta版本,因此不推薦使用。apache

若是你想使用這個特性,推薦使用如下版本:緩存

  1. Cloudera - CDH 5.4.x及以後版本
  2. Hortonworks - HDP 2.5及以後版本
  3. 華爲 - FusionInsight_HBase (不開源,一般在電信行業使用)

適用場景

這個特性適合將圖片、文檔、PDF、小視頻存儲到Hbase中。ide

典型的場景:oop

  • 銀行存取客戶簽字或掃描件。
  • 交通部門存取過車圖片。

MOB配置方法

  1. 啓用HFile Version 3

在hbase-si te.xml添加屬性性能

<property>
  <name>hfile.format.version</name>
  <value>3</value>
</property>

  2. 將列指定爲MOB類型測試

  • IS_MOB 設置爲true,將這個列存爲MOB.
  • MOB_THRESHOLD 設置閾值。超過閾值大小的文件,就被當成MOB對待。默認閾值爲100KB。

HBase Shell語句:spa

hbase> create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 102400}
hbase> alter 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD =>
102400}

若是用JAVA API,則代碼以下:

HColumnDescriptor hcd = new HColumnDescriptor(「f」);
hcd.setMobEnabled(true);
hcd.setMobThreshold(102400L);

HBase MOB 緩存設置

屬性 默認值 說明
hbase.mob.file.cache.size 1000 緩存文件數量
hbase.mob.cache.evict.period 3600 緩存清理時間
hbase.mob.cache.evict.remain.ratio 0.5f float類型,0和1之間

MOB測試

$ sudo -u hbase hbase org.apache.hadoop.hbase.IntegrationTestIngestMOB \
            -threshold 102400 \
            -minMobDataSize 512 \
            -maxMobDataSize 5120

手動壓縮MOB文件

使用compact_mob和major_compact_mob.

第一個參數是表名,只傳表名,則表中全部的MOB列都壓縮。

第二個參數是列名,若是傳入列名,則只壓縮指定列。

hbase> compact_mob 't1'
hbase> compact_mob 't1', 'f1'
hbase> major_compact_mob 't1'
hbase> major_compact_mob 't1', 'f1'

設置MOB壓縮策略(按周/月壓縮成一個文件)

默認天天的MOB壓縮成一個文件。

Apache HDFS對同一個目錄下的文件數量有內存限制。MOB文件的數量超過此HDFS限制後,MOB表不可再寫入。 Apache HDFS單個目錄默認最大文件數量爲100萬。

一年365天,天天一個文件,若是有1000個region,那麼一年就產生36.5萬個文件,3年就會超過這個限制。區域越多,達到極限的速度越快。

所以,若是須要,能夠設置爲每週的數據壓縮成一個文件,或者每個月的數據壓縮成一個文件。

默認狀況下,按天使用MOB壓縮分區策略。要應用每週或每個月策略,就須要爲MOB列族添加了一個新屬性MOB_COMPACT_PARTITION_POLICY。用戶能夠在HBase shell建立表時設置此屬性。

create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}

用戶還能夠從HBase shell更改現有表的MOB_COMPACT_PARTITION_POLICY。

alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}

若是策略從天天更改成每週或每個月,或每週更改成每個月,則下一個MOB壓縮將從新壓縮以前策略壓縮過的MOB文件。若是策略從每個月或每週更改成天天或每個月,每週更新已經壓縮的MOB文件與之前的策略不會被新策略從新壓縮。

 

參考文獻:

https://issues.apache.org/jira/browse/HBASE-11339

https://issues.apache.org/jira/browse/HBASE-16981

http://blog.cloudera.com/blog/2015/06/inside-apache-hbases-new-support-for-mobs/

https://blog.cloudera.com/blog/2017/06/introducing-apache-hbase-medium-object-storage-mob-compaction-partition-policies/

https://blog.cloudera.com/blog/2009/02/the-small-files-problem/

http://developer.huawei.com/cn/ict/Products/BigData/FusionInsightHD/HBase/SDK#section-1

https://www.cloudera.com/documentation/enterprise/5-4-x/topics/admin_hbase_mob.html

https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.5.3/bk_data-access/content/ch_MOB-support.html

相關文章
相關標籤/搜索