天天看點

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量

什麼是列簇(Family)?

列簇的特點:

1、一張表通常有一單獨的列簇,而且一張表中的列簇不會超過5個。

2、列簇必須在建立表的時候定義。

3、表的列簇無法改變。

4、每個列簇中的列數是沒有限制的。

5、同一列簇下的所有列會儲存在一起。

6、列在列簇中是有序的。

7、列在運作時建立。

8、列隻有插入後才會存在,空值并不儲存。

列簇的作用

權限控制、存儲以及調優都是在列族層面進行的

實際應用中,列族上的控制權限能 幫助我們管理不同類型的應用:我們允許一些應用可以添加新的基本資料、一些應用可以讀取基本資料并建立繼承的列族、一些應用則隻允許浏覽資料(甚至可能因 為隐私的原因不能浏覽所有資料)。

重點:列簇與資料存儲

對同一個行鍵的通路都會落在同樣的實體節點上。如果表包含2個列簇,屬于兩個列簇的檔案還是儲存在相同的節點上。是以,行鍵和節點存在一一對應的關系。

每一列簇都會儲存在自己的檔案集合中。在列簇中檢索某列是順序的I/O。從2個列簇中讀取資料表示需要讀取HDFS中2個不同的檔案和塊。所有的存儲設定都需要在列簇級别指定。

Region雖然是分布式操作的最小單元,但并不是存儲的最小單元,在region裡面,又劃分了很多更小的機關進行存儲,如下所示

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量
深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量
深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量
  1. Region由一個或者多個Store組成,每個Store儲存一個ColumnFamily
  2. 每個Store又由一個memStore和多個storefile組成
  3. memstore存儲在記憶體中,storefile存儲的HDFS上

RegionServer打開一個region的時候,會建立一個相應的HRegion對象。當這個HRegion被打開,他會為每一個表中的每一個列簇建立一個Store執行個體,就像使用者之前建立的那樣。每一個Store執行個體相應地有一個或者多個StoreFile執行個體,StoreFile是真正存儲資料的檔案(HFile)的(hdfs系統中對應的目錄)

一個Store還會有一個Memstore。

每一個HRegionServer中的所有東西會共享一個HLog執行個體。(WAL執行個體)

hbase table中每個列簇都對應着region中的一個store,在hdfs系統中則對應着一個目錄,如果列簇中尚無資料,怎該目錄為空,也就是該store下還沒有storefile。

關于列簇的數量

如果隻有一個family,那麼每一次讀都會讀取目前rowkey的所有資料,網絡和io上會有一些損失。

如果family設定的很多那麼擷取每一個cell資料的優勢越明顯,因為io和網絡都減少了

當然如果要擷取的是固定的幾列資料,那麼把這幾列寫到一個family中比分别設定family要更好,因為隻需一次請求就能拿回所有資料。

每一個family都會配置設定一個memstore,是以更多的family會消耗更多的記憶體。

其次,目前版本的hbase,在flush和compaction都是以region為機關的,也就是說當一個family達到flush條件時,該region的所有family所屬的memstore都會flush一次,即使memstore中隻有很少的資料也會觸發flush而生成小檔案。

--->小的檔案多了就會增加compaction的幾率(合并小檔案)

– 目前為止HBase的列族能能夠很好處理最多不超過3個列族。

對于傳統關系型資料庫中的一張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。

1.house_hire_analysis 表中列簇total下無資料,另一張表fangyuan下有資料:

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量

2.檢視hdfs region下的内容

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量

3. hbase console 如圖:

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量

4.put一條記錄到house_hire_analysis中,并flush,flush将改動從memstore重新整理到磁盤

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量
深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量

5. hbase cosole storefile已經增加

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量

6.新flush的kv根據政策會分别存到不同的storefiles中(最後compaction 會将這些小檔案合并)

深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量
深入了解HBASE(2)列簇與Qualifier什麼是列簇(Family)?列簇的特點:列簇的作用重點:列簇與資料存儲關于列簇的數量

轉自:

https://www.jianshu.com/p/8ff206361c8c 

http://zhb-mccoy.iteye.com/blog/1543492

繼續閱讀