HBase入門實例: Table中Family和Qualifier的關系與區別


Table中Family和Qualifier的關系與區別

就像用MySQL一樣,我們要做的是表設計,MySQL中的表,行,列的在HBase已經有所區別了,在HBase中主要是Table和Family和Qualifier,這三個概念。Table可以直接理解為表,而Family和Qualifier其實都可以理解為列,一個Family下面可以有多個Qualifier,所以可以簡單的理解為,HBase中的列是二級列,也就是說Family是第一級列,Qualifier是第二級列。兩個是父子關系。

談談Table中Family和Qualifier的設置
對於傳統關系型數據庫中的一張table,在業務轉換到hbase上建模時,從性能的角度應該如何設置family和qualifier呢?
最極端的,可以每一列都設置成一個family,也可以只有一個family,但所有列都是其中的一個qualifier,那么有什么區別呢?
family越多,那么獲取每一個cell數據的優勢越明顯,因為io和網絡都減少了,而如果只有一個family,那么每一次讀都會讀取當前rowkey的所有數據,網絡和io上會有一些損失。
當然如果要獲取的是固定的幾列數據,那么把這幾列寫到一個family中比分別設置family要更好,因為只需一次請求就能拿回所有數據。
以上是從讀的方面來考慮的,那么寫呢?可以參考一下這篇文章:
http://hbase.apache.org/book/number.of.cfs.html
首先,不同的family是在同一個region下面。而每一個family都會分配一個memstore,所以更多的family會消耗更多的內存。
其次,目前版本的hbase,在flush和compaction都是以region為單位的,也就是說當一個family達到flush條件時,該region的所有family所屬的memstore都會flush一次,即使memstore中只有很少的數據也會觸發flush而生成小文件。這樣就增加了compaction發生的機率,而compaction也是以region為單位的,這樣就很容易發生compaction風暴從而降低系統的整體吞吐量。
第三,由於hfile是以family為單位的,因此對於多個family來說,數據被分散到了更多的hfile中,減小了split發生的機率。這是把雙刃劍。更少的split會導致該region的體積比較大,由於balance是以region的數目而不是大小為單位來進行的,因此可能會導致balance失效。而從好的方面來說,更少的split會讓系統提供更加穩定的在線服務。
上述第三點的好處對於在線應用來說是明顯的,而壞處我們可以通過在請求的低谷時間進行人工的split和balance來避免掉。
因此對於寫比較多的系統,如果是離線應該,我們盡量只用一個family好了,但如果是在線應用,那還是應該根據應用的情況合理地分配family。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM