1.初識Hbase


一、Hbase介紹:

  (HBase的默認端口號:60010)

   一個分布式、可擴展的支持海量數據存儲的NoSQL數據庫,基於HDFS分布式文件系統,利用zookeeper作為協同服務去構建的。他的數據是存儲在HDFS之上。主要用來存儲非結構化和半結構化的松散數據。(所以啟動的時候先啟動HDFS和zookeeper)

 

 

 一個列簇包含有多個列(一個H表中盡量少的設計列簇,而列可以隨意多)。

真正往HDFS上存儲的就是store的內容。

Region就是表的切片,一個表被分成多個Region。

 特點:

    1.低成本;

    2.高並發的隨機寫;

    3.支持實時查詢;

    4.存儲海量數據;(上億行,上百萬列)

    5.數據的“結構”非常靈活;

    6.面向列(簇)的存儲和權限控制,獨立檢索(僅能通過主鍵(row key)和主鍵的range來檢索數據)

    7.表設計稀疏:值為空的列不占空間

  

  學習HBase最好不要用RDBMS類型來理解,Hbase是面向列(實際上是列簇),而傳統的關系型數據庫是面向行存儲的。

 


 二、Hbase入門:

首先來理解幾個概念

1.Row Key:行鍵

  用來檢索記錄的主鍵。

  訪問Hbase table中的行,只有三種形式:

    A、通過單個row key訪問

    B、通過row key 的range

    C、全表掃描

  行鍵 (Row key)可以是任意字符串(最大長度是 64KB,實際應用中長度一般為 10-100bytes),在hbase內部,row key保存為字節數組。

  存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)

  注意:

  字典序對int排序的結果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行鍵必須用0作左填充。

 

2、Columns Family:列簇

  Hbase表中的每個列,都屬於某個列簇,一個列簇可包含多個列。列名都以列簇為前綴。例如:student : name , student : age 這兩個列,都屬於student這個列簇。


3、Time Stamp:時間戳

  Hbase中通過rowkey和columns確定的為一個存儲單元稱為cell。每個cell都保存着同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是64位整型。時間戳可以由

Hbase(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯示賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。

每個cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面

  為了避免數據存在過多版本造成的管理(包括存儲和索引)負擔,Hbase提供了兩種數據版本回收方式。一是保存數據的最后n個版本,而是保存最近一段時間內的版本(比如最近7天)。用戶可以針對每個列簇進行設置。


4、Cell:單元

  由{row key,columnFamily,version} 唯一確定的單元。cell中的數據是沒有類型的,全部是字節碼形式存儲。(hbase底層就是字節數組)。

 


三、Hbase架構

系統架構圖:

Hbase中的角色:

1. 一個或者多個(高可用)主節點:Hmaster

  Hmaster可以有多個,通過zookeeper的Master Election機制,活躍狀態的只有一個。

  主要負責Table和Region的管理工作:

    1.   管理用戶對表的增刪改查操作(注意是對表!!!DDL!!!不是對表數據DML!!!)
    2.   管理HRegionServer的負載均衡,調整Region分布
    3.   Region Split后,負責新Region的分布
    4.   在HRegionServer停機后,負責失效HRegionServer上Region遷移

 

2. Hbase依賴項:zookeeper

  Zookeeper Quorum 存儲-ROOT-表地址、Hmaster地址。

  客戶端首先聯系ZooKeeper子集群(quorum)(一個由ZooKeeper節點組成的單獨集群)查找行健。上述過程是通過ZooKeeper獲取含有-ROOT-的region服務器名(主機名)來完成的。通過含有-ROOT-的region服務器可以查詢到含有.META.表中對應的region服務器名,其中包含請求的行健信息。這兩處的主要內容都被緩存下來了,並且都只查詢一次。最終,通過查詢.META服務器來獲取客戶端查詢的行健數據所在region的服務器名。一旦知道了數據的實際位置,即region的位置,HBase會緩存這次查詢的信息,同時直接聯系管理實際數據的HRegionServer。所以,之后客戶端可以通過緩存信息很好地定位所需的數據位置,而不用再次查找.META.表。

  以上也正是Hbase雖然基於HDFS但任然高效的原因所在。

 

3.多個從節點:HregionServer

  Hbase中核心部分,主要負責響應客戶端的I/O請求,向HDFS系統進行讀寫。負責管理Region對象。它是對表的數據進行增刪改查DML,注意區分開他和Hmaster的分工。

 4.Hregion

  Hbase表中行的方向上分隔為多個Hregion。不同的Hregion可以分布在不同的HregionServer上,但同一個Hregion只能放在一個HregionServer上。

  Hregion按照大小進行分隔,一個表初始只有一個region,隨着數據不斷增加,region也在不斷擴大,當達到某一個閾值(默認128M,有些地方說256M,有待考察。。。) 時就會隨分成2個region。Split

  每一個Region由以下兩部分確定:

    1.表名+startRowKey+創建時間

    2.由目錄表(-ROOT-和.META.)記錄該region的endRowKey。

  那么我們如何定位Hregion?====>三層結構:

    1.   通過zookeeper里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一個region。
    2.   通過-ROOT-表查找.META.表的第一個表中相應的region的位置。.META.表中的每一個region在-ROOT-表中都是一行記錄。
    3.   通過.META.表找到所要的用戶表region的位置。用戶表中的每個region在.META表中都是一行記錄

    以上三層結構就像一個分布式的B+樹,-ROOT-永遠只有一個region,他是根。

  Table和Hregion的關系:

    table默認最初只有一個region,隨着記錄數的不斷增加而變大,起初的region會逐漸分裂成多個region,一個region由【startKey, endKey】表示,不同的region會被master分配給相應的regionserver管理。region是hbase分布式存儲和負載均衡的最小單元,不同的region分到不同的regionServer。region雖然是分布式存儲的最小單元,但並不是存儲的最小單元。region是由一個或者多個store組成的,每個store就是一個column family。每個store又由memStore和1至多個store file 組成(memstore到一個閥值會刷新,寫入到storefile,有hlog來保證數據的安全性,一個regionServer有且只有一個hlog)。

5.Hstore:

  HBase存儲的核心。由MemStore和StoreFile組成。存儲的其實就是我們的列簇。

 

6.Hlog:

  在分布式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種情況。

 

總結下:

  HMaster管理的是對庫、表的操作(DDL),HRegionServer管理的是對表里數據的操作(DML);

  HMaster還負責管理Hregion具體往那個HRegionServer上分布(負載均衡);

  HregionServer管理着Hregion和Hlog;

  Hregion其實就是表中的多行數據(整行),他包含Store和MemStore;

  Store中其實存儲的就是列簇;

  Hlog里記錄的是你的數據的操作,因為一切操作在內存上完成,假如內存崩掉,數據

就會丟失,這時Hlog記錄了你的操作,他會進行落盤。


 

 下篇討論Hbase的讀寫流程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM