Hbase表中的每個列,都歸屬與某個列族。列族是表的chema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為首碼。例如courses:history,courses:math 都屬於courses 這個列族。訪問控制、磁碟和記憶體的使用統計都是在列族層面進行的。實際應用中,列族上的控制權... ...
一、hbase是什麼
HBase 是一種類似於資料庫的存儲層,也就是說 HBase 適用於結構化的存儲。並且 HBase 是一種列式的分散式資料庫,是由當年的 Google 公佈的 BigTable 的論文而生。HBase 底層依舊依賴 HDFS 來作為其物理存儲。
二、hbase的列式存儲結構
行式存儲:傳統的資料庫是關係型的,且是按行來存儲的
其中只有張三把一行數據填滿了,李四王五趙六的行都沒有填滿。因為這裡的行結構是固定的,每一行都一樣,即使你不用,也必須空到那裡,而不能沒有。
列式存儲:
HBase是一個面向列的資料庫,在表中它由行排序。表模式定義只能列族,也就是鍵值對。一個表有多個列族以及每一個列族可以有任意數量的列。後續列的值連續地存儲在磁碟上。表中的每個單元格值都具有時間戳。總之,在一個HBase:
- 表是行的集合。
- 行是列族的集合。
- 列族是列的集合。
- 列是鍵值對的集合。
Row key行鍵 (Row key): 可以是任意字元串(最大長度是 64KB,實際應用中長度一般為 10-100bytes),在Hbase內部,row key保存為位元組數組。存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)。
列族: Hbase表中的每個列,都歸屬與某個列族。列族是表的chema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為首碼。例如courses:history,courses:math 都屬於courses 這個列族。訪問控制、磁碟和記憶體的使用統計都是在列族層面進行的。實際應用中,列族上的控制許可權能幫助我們管理不同類型的應用:我們允許一些應用可以添加新的基本數據、一些應用可以讀取基本數據並創建繼承的列族、一些應用則只允許瀏覽數據(甚至可能因為隱私的原因不能瀏覽所有數據)。
時間戳: Hbase中通過row和columns確定的為一個存貯單元稱為cell。每個 cell都保存著同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由Hbase(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程式要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。每個 cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。 為了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,Hbase提供了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
Cell: 由{row key, column(= + ), version} 唯一確定的單元。cell中的數據是沒有類型的,全部是位元組碼形式存貯。
三、hbase架構
Zookeeper
Zookeeper 是作為 HBase Master 的 HA 解決方案。也就是說,是 Zookeeper 保證了至少有一個 HBase Master 處於運行狀態。並且 Zookeeper 負責 Region 和 Region Server 的註冊。
HMaster:
HBase Master 用於協調多個 HRegion Server,偵測各個 HRegion Server 之間的狀態,並平衡 HRegion Server 之間的負載。HBase Master 還有一個職責就是負責分配 Region 給 HRegion Server。HBase 允許多個 Master 節點共存,但是這需要 Zookeeper 的幫助。不過當多個 Master 節點共存時,只有一個 Master 是提供服務的,其他的 Master 節點處於待命的狀態。當正在工作的 Master 節點宕機時,其他的 Master 則會接管 HBase 的集群。
- 為Region server分配region,負責region server的負載均衡
- 管理用戶對Table的增、刪、改、查操作
- 發現失效的region server並重新分配其上的region
- GFS上的垃圾文件回收
- 在HRegionServer停機後,負責失效HRegionServer 上的Regions遷移
HDFS:
HDFS是Hbase運行的底層文件系統
HRegionServer
HRegionServer是RegionServer的實現,服務和管理Regions,集群中HRegionServer運行在DataNode上。
對於一個 HRegion Server 而言,其包括了多個 HRegion。HRegion Server 的作用只是管理表格,以及實現讀寫操作。Client 直接連接 HRegion Server,並通信獲取 HBase 中的數據。對於 Region 而言,則是真實存放 HBase 數據的地方,也就說 Region 是 HBase 可用性和分散式的基本單位。如果當一個表格很大,並由多個 CF 組成時,那麼表的數據將存放在多個 Region 之間,並且在每個 Region 中會關聯多個存儲的單元(Store)。
HRegion
Region 是真實存放 HBase 數據的地方,也就說 Region 是 HBase 可用性和分散式的基本單位;每個HRegion對應了Table中的一個Region,隨著數據的不斷加入,region會不斷增大,當region增大一個閥值時,region會等分為兩個region。當region分裂越來越多時,都將在Region Server上這時將無法滿足負載均衡,所以Hmaster 將會發起協調的作用,將給table的所有region平均分配到所有的region Server上。
HRegion中由多個HStore組成。每個HStore對應了Table中的一個Column Family的存儲,可以看出每個Column Family其實就是一個集中的存儲單元,因此最好將具備共同IO特性的column放在一個Column Family中,這樣最高效。HStore包括記憶體memstore 和位於磁碟的storeFile;數據寫入時先進入memstore,當memstore中的數據到達閥值後,HRegion Server 會啟動flashcache 進程將記憶體的數據寫入磁碟storeFile。每次寫入都會形成一個單獨的storeFile文件。當storeFile文件的數量到達一個閥值時,系統會將storeFile文件合併,在合併時會進行版本的合併和刪除文件(合併時會刪除低版本的數據),形成一個更大的storeFile。在合併期間無法訪問數據。
客服端查找數據時,先在memstroe查找,然後storeFile。
HLOG