深入理解HBASE(2)列簇與Qualifier

什么是列簇(Family)?

列簇是基礎(chǔ)信息或公司域名或水果類。列是基礎(chǔ)信息:面貌、基礎(chǔ)信息:年齡、公司域名:org、公司域名:edu、水果類:蘋果、水果類:香蕉。
qualifier是列的名字。

image.png

[圖片上傳中...(image.png-371d2f-1553349122734-0)]

所以可以簡(jiǎn)單的理解為,HBase中的列是二級(jí)列,
也就是說Family是第一級(jí)列,Qualifier是第二級(jí)列。兩個(gè)是父子關(guān)系。

cell

由{row key,column(=<family> +<qualifier>),version}
唯一確定的單元。
一般get出來的為最新版本,也可以指定
get 'me','weihongrao',{COLUMNS=>['f1:age','f1:home'],VERSIONS=>2}

列簇的特點(diǎn):

1、一張表通常有一單獨(dú)的列簇,而且一張表中的列簇不會(huì)超過5個(gè)。
2、列簇必須在創(chuàng)建表的時(shí)候定義。
3、表的列簇?zé)o法改變。
4、每個(gè)列簇中的列數(shù)是沒有限制的。
5、同一列簇下的所有列會(huì)保存在一起。
6、列在列簇中是有序的。
7、列在運(yùn)行時(shí)創(chuàng)建。
8、列只有插入后才會(huì)存在,空值并不保存。

列簇的作用

權(quán)限控制、存儲(chǔ)以及調(diào)優(yōu)都是在列族層面進(jìn)行的
實(shí)際應(yīng)用中,列族上的控制權(quán)限能 幫助我們管理不同類型的應(yīng)用:我們?cè)试S一些應(yīng)用可以添加新的基本數(shù)據(jù)、一些應(yīng)用可以讀取基本數(shù)據(jù)并創(chuàng)建繼承的列族、一些應(yīng)用則只允許瀏覽數(shù)據(jù)(甚至可能因 為隱私的原因不能瀏覽所有數(shù)據(jù))。

重點(diǎn):列簇與數(shù)據(jù)存儲(chǔ)

對(duì)同一個(gè)行鍵的訪問都會(huì)落在同樣的物理節(jié)點(diǎn)上。如果表包含2個(gè)列簇,屬于兩個(gè)列簇的文件還是保存在相同的節(jié)點(diǎn)上。因此,行鍵和節(jié)點(diǎn)存在一一對(duì)應(yīng)的關(guān)系。
每一列簇都會(huì)保存在自己的文件集合中。在列簇中檢索某列是順序的I/O。從2個(gè)列簇中讀取數(shù)據(jù)表示需要讀取HDFS中2個(gè)不同的文件和塊。所有的存儲(chǔ)設(shè)置都需要在列簇級(jí)別指定。

Region雖然是分布式操作的最小單元,但并不是存儲(chǔ)的最小單元,在region里面,又劃分了很多更小的單位進(jìn)行存儲(chǔ),如下所示


image.png
  1. Region由一個(gè)或者多個(gè)Store組成,每個(gè)Store保存一個(gè)ColumnFamily
  2. 每個(gè)Store又由一個(gè)memStore和多個(gè)storefile組成
  3. memstore存儲(chǔ)在內(nèi)存中,storefile存儲(chǔ)的HDFS上

RegionServer打開一個(gè)region的時(shí)候,會(huì)創(chuàng)建一個(gè)相應(yīng)的HRegion對(duì)象。當(dāng)這個(gè)HRegion被打開,他會(huì)為每一個(gè)表中的每一個(gè)列簇創(chuàng)建一個(gè)Store實(shí)例,就像用戶之前創(chuàng)建的那樣。每一個(gè)Store實(shí)例相應(yīng)地有一個(gè)或者多個(gè)StoreFile實(shí)例,StoreFile是真正存儲(chǔ)數(shù)據(jù)的文件(HFile)的(hdfs系統(tǒng)中對(duì)應(yīng)的目錄)
一個(gè)Store還會(huì)有一個(gè)Memstore。
每一個(gè)HRegionServer中的所有東西會(huì)共享一個(gè)HLog實(shí)例。(WAL實(shí)例)

hbase table中每個(gè)列簇都對(duì)應(yīng)著region中的一個(gè)store,在hdfs系統(tǒng)中則對(duì)應(yīng)著一個(gè)目錄,如果列簇中尚無數(shù)據(jù),怎該目錄為空,也就是該store下還沒有storefile。

關(guān)于列簇的數(shù)量

如果只有一個(gè)family,那么每一次讀都會(huì)讀取當(dāng)前rowkey的所有數(shù)據(jù),網(wǎng)絡(luò)和io上會(huì)有一些損失。

如果family設(shè)置的很多那么獲取每一個(gè)cell數(shù)據(jù)的優(yōu)勢(shì)越明顯,因?yàn)閕o和網(wǎng)絡(luò)都減少了
當(dāng)然如果要獲取的是固定的幾列數(shù)據(jù),那么把這幾列寫到一個(gè)family中比分別設(shè)置family要更好,因?yàn)橹恍枰淮握?qǐng)求就能拿回所有數(shù)據(jù)。

每一個(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而生成小文件。
--->小的文件多了就會(huì)增加compaction的幾率(合并小文件)
– 目前為止HBase的列族能能夠很好處理最多不超過3個(gè)列族。

對(duì)于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中的一張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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容