1. 背景
HBase 可以很友善的将圖檔、文本等檔案以二進制的方式進行存儲。雖然 HBase 一般可以處理從 1 位元組到 10MB 大小的二進制對象,但是 HBase 通常對于讀寫路徑的優化主要是針對小于 100KB 的值。當 HBase 處理資料為 100KB~10MB 時, 由于分裂(split)和壓縮(compaction)會引起寫的放大,進而會降低 HBase 性 能。是以在 HBase2.0+引入了 MOB 特性,這樣保持了 HBase 的高性能、強一緻 性和低開銷。
若要啟用 MOB 功能,需要在每個 RegionServer 進行配置,并在建表或者修改表 時對指定列族啟用 MOB 特性。在 HBase 嘗鮮版中啟用 MOB 功能,需要由 admin 使用者設定定期程序,以重新優化 MOB 資料的分布。
2. 啟用和配置 RegionServer 上的 MOB 特性
增加或者修改 hbase-site.xml 檔案中的某些配置
2.1 設定 MOB 檔案的緩存配置

- hbase.mob.file.cache.size 打開的檔案句柄緩存數,預設值是 1000。通 過增加檔案句柄數可以提高讀的性能,可以減少頻繁的打開、關閉檔案。若這個值設定過大,會導緻“too many opened file handers”。
-
hbase.mob.cache.evict.period MOB 緩存淘汰緩存的 MOB 檔案時間間隔
(以秒為機關),預設值為 3600 秒。
- hbase.mob.cache.evict.remain.ratio 當緩存的 MOB 檔案數 目超 過hbase.mob.file.cache.size 設定的數目後,會觸發 MOB 緩存淘汰機制 (eviction),0.5f 為剩餘的 MOB 緩存比率(0~1),預設的比率為 0.5f。
2.2 配置 MobMasterObserver 作為協處理器的 master
主要用于表在删除後,MOB 檔案的歸檔。
MOB的管理 MOB 特性為 HBase 引入新的讀寫路徑,此時我們采用外部工具對其進行優化處理,一個是 expiredMobFileCleanerTTL 處理 TTL 和時間的過期資料,另一個是清理工具用來合并小的 MOB 檔案或者多次更新、删除的 MOB 檔案。
2.2.1 清理過期的 MOB 資料(expiredMobFileCleaner)
設定清理延時
2.2.2 清理工具
屬性值設定如下:
- hbase.mob.compaction.invalid.file.ratio 如果在 MOB 檔案中删除了太 多的單元格,則被視為作為無效檔案,需要重新寫入或者合并。當 MOB 檔案 (mobFileSize)大小減去存在的單元格(existingCellsSize)大小之差除 以 MOB 檔案(mobFileSize)的比率小于設定的值時,我們就認為其為無效 檔案。預設值為0.3f。
- hbase.mob.compaction.small.file.threshold 如果 MOB 的大小小于門檻值, 則視為小檔案,需要合并。預設值為64MB。
- 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/
在表中開啟 MOB 特性 a 将列族設定為 MOB
2.2.3 設定 MOB 單元格的門檻值,預設為 102400
對于用戶端而言,MOB 單元格操作和普通單元格類似。
2.2.4 插入 MOB 值
2.2.5 擷取 MOB 值
2.2.6 擷取 MOB 所有資料(raw =true)
運作一個 MOB 示例