一、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
?