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