Table中Family和Qualifier的关系与区别(转载)
Table中Family和Qualifier的關(guān)系與區(qū)別
就像用MySQL一樣,我們要做的是表設(shè)計,MySQL中的表,行,列的在HBase已經(jīng)有所區(qū)別了,在HBase中主要是Table和Family和Qualifier,這三個概念。
Table可以直接理解為表,而Family和Qualifier其實都可以理解為列,
一個Family下面可以有多個Qualifier,所以可以簡單的理解為,
HBase中的列是二級列,也就是說Family是第一級列,Qualifier是第二級列。兩個是父子關(guān)系。
談?wù)凾able中Family和Qualifier的設(shè)置
對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫中的一張table,在業(yè)務(wù)轉(zhuǎn)換到hbase上建模時,從性能的角度應(yīng)該如何設(shè)置family和qualifier呢?
最極端的,可以每一列都設(shè)置成一個family,也可以只有一個family,但所有列都是其中的一個qualifier,那么有什么區(qū)別呢?
family越多,那么獲取每一個cell數(shù)據(jù)的優(yōu)勢越明顯,因為io和網(wǎng)絡(luò)都減少了,而如果只有一個family,那么每一次讀都會讀取當(dāng)前rowkey的所有數(shù)據(jù),網(wǎng)絡(luò)和io上會有一些損失。
當(dāng)然如果要獲取的是固定的幾列數(shù)據(jù),那么把這幾列寫到一個family中比分別設(shè)置family要更好,因為只需一次請求就能拿回所有數(shù)據(jù)。
以上是從讀的方面來考慮的,那么寫呢?可以參考一下這篇文章:
http://hbase.apache.org/book/number.of.cfs.html
首先,不同的family是在同一個region下面。而每一個family都會分配一個memstore,所以更多的family會消耗更多的內(nèi)存。
其次,目前版本的hbase,在flush和compaction都是以region為單位的,也就是說當(dāng)一個family達到flush條件時,該region的所有family所屬的memstore都會flush一次,即使memstore中只有很少的數(shù)據(jù)也會觸發(fā)flush而生成小文件。這樣就增加了compaction發(fā)生的機率,而compaction也是以region為單位的,這樣就很容易發(fā)生compaction風(fēng)暴從而降低系統(tǒng)的整體吞吐量。
第三,由于hfile是以family為單位的,因此對于多個family來說,數(shù)據(jù)被分散到了更多的hfile中,減小了split發(fā)生的機率。這是把雙刃劍。更少的split會導(dǎo)致該region的體積比較大,由于balance是以region的數(shù)目而不是大小為單位來進行的,因此可能會導(dǎo)致balance失效。而從好的方面來說,更少的split會讓系統(tǒng)提供更加穩(wěn)定的在線服務(wù)。
上述第三點的好處對于在線應(yīng)用來說是明顯的,而壞處我們可以通過在請求的低谷時間進行人工的split和balance來避免掉。
因此對于寫比較多的系統(tǒng),如果是離線應(yīng)該,我們盡量只用一個family好了,但如果是在線應(yīng)用,那還是應(yīng)該根據(jù)應(yīng)用的情況合理地分配family。
總結(jié)
以上是生活随笔為你收集整理的Table中Family和Qualifier的关系与区别(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 郑好办怎么交契税
- 下一篇: show Locks LockManag