HBase系列 列族設計及影響

2021-10-20 19:26:56 字數 1839 閱讀 2750

hbase表中的每個列,都歸屬於某個列族。列族是表的schema的一部 分(而列不是),必須在使用表之前定義。列名都以列族作為字首。例如 courses:history,courses:math都屬於courses 這個列族。

hbase官網建議每張表的列族數建議設在1-3之間,所以說列族的設計並不是越多越好。

其實可以大致分為5個方面來理解。

回顧一下hbase,每張表會根據rowkey值被切分為多個region,每個region也就是表的一部分子集,region會分散到hbase集群regionserver上;region中每個columnfamily也就是列族的資料組成乙個store。每個store由乙個memstore和多個hfile組成(乙個列族對應乙個memstore和n個hfile),如果我們的表有兩個列族,那麼相應的 region 中存在兩個 memstore,列族越多,將會導致記憶體中存在越多的 memstore;而儲存在 memstore 中的資料在滿足一定條件的時候將會進行 flush 操作;每次 flush 的時候,每個 memstore 將在磁碟生產乙個 hfile 檔案,如下:

比如在flush時候,如果有多個memstore(多個列簇),只要有乙個memstore達到flush條件,其他的memstore即使資料很小也要跟著執行flush,這也就導致了很多不必要的i/o開銷。觸發flush的條件如下:

hbase split是由引數hbase.hregion.max.filesize值來控制的,但是,觸發region split不是說該region下所有的hfile檔案大小達到這個值就會觸發split,而是region下某個hfile檔案達到了這個值才會執行split,也就是說這裡columnfamilyb在做split時候,columnfamilya的資料量還很小很小,但是也會被帶著執行split,這也就會導致更多的hdfs小檔案,並且分散到更多的region和regionservers上,注意,region split 是針對所有的列族進行的,這樣做的目的是同一行的資料即使在 split 後也是存在同乙個 region 的。

在compact時候,由於是建立在region的基礎上,同樣會產生不必要的i/o開銷,觸發compcat(minor_compact)條件:

hbase.hstore.compactionthreshold:default 3

dfs.namenode.fs-limits.max-directory-items是說hdfs的子目錄下檔案個數的限制,乙個列族是對應到hdfs上的乙個子目錄的,不過相同表的資料是放乙個目錄的,如果我們有 n 個列族,m 個 region,那麼我們持久化到 hdfs 至少會產生 nm 個檔案;而每個列族對應底層的 hfile 檔案往往不止乙個,我們假設為 k 個,那麼最終表在 hdfs 目錄下的檔案數將是 nm*k,這可能會操作 hdfs 的限制。

乙個列族在 regionserver 中對應於乙個 memstore。而 hbase 從 0.90.1 版本開始引入了 mslab(memstore-local allocation buffers,參考hbase-3455),這個功能預設是開啟的(通過hbase.hregion.memstore.mslab.enabled),這使得每個 memstore 在記憶體占用了 2mb (通過hbase.hregion.memstore.mslab.chunksize 配置)的 buffer。如果我們有很多的列族,那麼光 memstore 的快取就會占用很多的記憶體。

在設定列族之前,我們最好想想,有沒有必要將不同的列放到不同的列族裡面。如果沒有必要最好放乙個列族。如果真要設定多個列族,但是其中一些列族相對於其他列族資料量相差非常懸殊,比如1000w相比100行,是不是考慮用另外一張表來儲存相對小的列族。

Hbase 列族設計

在大多數的工廠環境下,往往只會設計乙個列族,因為列族數量過多會導致如下的效能問題 1.flush 會產生大量 io flush 的最小單元是 region,也就是說乙個 region 中的某個列族做 flush 操作,其他的 列族也會 flush,對每個列族而言,每次 flush 都會產生乙個檔案,...

HBase學習 列族

列在列簇中依照字典排序。例如,列簇是基礎資訊或公司網域名稱或水果類。列是基礎資訊 面貌 基礎資訊 年齡 公司網域名稱 org 公司網域名稱 edu 水果類 蘋果 水果類 香蕉。列 列簇 列修飾符 列根據列簇分組。列簇的特點 1 一張表通常有一單獨的列簇,而且一張表中的列簇不會超過5個。2 列簇必須在...

原創 HBase中列族設計的原則

hbase表在進行模式設計時,首先考慮的乙個問題是,這個表應該有多少個列族。一張表設計多少列族合理呢?相信這個問題困擾著不少hbase初學者。讓我們來先簡單分析一下hbase的實現原理。hbase中的表 和其資料庫一樣,也是由行和列組成的,雖說模式有些不同。hbase中的表可能達到數十億行和數百萬列...