1. 程式人生 > >HBase基礎知識學習

HBase基礎知識學習

在伺服器的開發過程中,資料的儲存至關重要,包括任務狀態的資料、中間資料,處理的結果資訊等。當資料量很大時,這些關係型資料庫就必然存在瓶頸(資料庫的查詢,資料庫的欄位變更等)。本文基於分散式資料庫HBase進行探究,簡要介紹HBase的概念,及其相關操作。

HBase基礎

HBase基本概念

HBase 是Hadoop的一個子專案,HBase採用了Google BigTable的稀疏的,面向列的資料庫實現方式的理論,建立在Hadoop的HDFS上。一方面裡用了HDFS的高可靠性和可伸縮行,另外一方面裡用了BigTable的高效資料組織形式。HBase為海量資料的實時性相應提供了很好的一個開源解決方案。

HBase的基本結構

  • HBase的邏輯模型

HBase以表的形式儲存資料,每個表由行和列組成,每個列屬於一個特定的列族(Column Family)。表中由行和列確定的儲存單元稱為一個元素(Cell)。

 行鍵
行健是資料行在表中的唯一標識,並作為檢索記錄的主鍵。在HBase中訪問表的行有三種方式:通過單個行鍵訪問、在給定行鍵範圍內訪問、全表掃描。行鍵可以是任務字串,並按照字典序進行排序。
 時間戳
時間戳對應著每次資料操作所關聯的時間,可以由系統自動生成,也可以由使用者顯式賦值。
 列
列定義為:<family>:<qualifier>(<列族>:<限定符>)。HBase在磁碟上是按照列族儲存資料。
 元素
元素由行健、列(<列族>:<限定符>)和時間戳唯一確定,元素中的資料以位元組碼的形式儲存,沒有型別之分。
 HBase的物理模型
HBase是按照列儲存的稀疏行/列矩陣,物理模型實際上就是把邏輯模型中的一個行進行分割,並按照列族儲存。

                                  

        如上圖所示,表中的空值是不被儲存的。如果沒有指明時間戳,那麼應該返回指定列的最新資料值。且最新的值在表格裡面也是最先找到的,因為它們是按照時間排序的。如果沒有指明時間戳,那麼應該返回指定列的最新資料值,並且最新的值在表格也是最先找到的,因為它們是按照時間排序的。這種儲存結構還有一個優勢,可以隨時向表中的任何一個列族新增新列,而不需要事先宣告。
        HBase是按照BigTable模型實現的,是一個稀疏的、分散式的、持久化的、多維的對映。由行健、列族和時間戳索引。將以上特點聯絡在一起,有了如下資料存取模式:
       {Table,RowKey,Family,Column,Timestamp}->value

HBase的Region與Store

        HBase在行的方向上將表分成了多個Region,每個Region包含了一定範圍內(根據行鍵進行劃分)的資料。每個表最初只有一個Region,隨著表中記錄不斷增加直到超過某個閾值時,Region就會被分割形成兩個新的Region。
所以一段時間後,一個表通常會含有多個Region。Region是HBase中分散式儲存和負載均衡的最小單位,即一個表的所有Region會分佈在不同的Region伺服器(region servers)上,但一個Region內的資料只會儲存在一個伺服器上。

                                                                 


       每個Region由一個或多個Store組成,每個Store儲存一個列族的所有資料每個Store又是由一個memStore和零個或者多個StoreFile組成,StoreFile則是以HFile的格式儲存在HDFS上的。
                                                                   

        當資料庫進行更新操作時,先連線有關的HRegionServer,然後向Region提交變更。提交的資料會首先寫入WAL和MemStore中,當MemStore中的資料累計到某個閾值時,HRegionServer就會啟動一個單獨的執行緒將MemStore中的內容刷寫到磁碟,形成一個StoreFile,合併過程中會進行版本合併和資料刪除,因此可以看出HBase其實只有增加資料,所有的更新和刪除操作都是在後續的合併過程中進行的。
        StoreFile在合併過程中會逐步形成更大的StoreFile,當單個StoreFile大小超過一定閾值後,會把當前的Region分割成兩個Regions,並由HMaster分配到相應的Region伺服器上,實現負載均衡。

HBase與RDBMS比較

        RDBMS是傳統意義上的關係型資料庫管理系統,與RDBMS相比較,HBase適合儲存半結構化或者非結構化的資料,對於資料結構欄位不夠確定或者雜亂無章很難按照一個概念去進行抽取的資料適用HBase。HBase與RDBMS的優缺點比較如下:
  記錄稀疏
RDBMS的行有多少列式固定的,為NULL的列浪費了儲存空間。而HBase為NULL的列不會被儲存,這樣既節省了空間又提高了讀效能。
 多版本
根據行鍵和列族定位到的值可以有任意數量的版本值,因此對於需要儲存變動歷史記錄的資料,用HBase就非常方便了。
 超大資料量
當資料量越來越大,RDBMS資料庫撐不住了,就出現了讀寫分離策略,通過一個Master專門負責寫操作,多個Slave負責讀操作,伺服器成本倍增。隨著壓力增加,Master撐不住了,這時就要分庫了,把關聯不大的資料分開部署,一些join查詢不能用了,需要藉助中間層。隨著資料量的進一步增加,一個表的記錄越來越大,查詢就變得很慢,於是又得搞分表,比如按ID取模分成多個表以減少單個表的記錄數。經歷過這些事的人都知道過程是多麼的折騰。採用HBase就簡單了,只需要加機器即可,HBase會自動水平切分擴充套件,跟Hadoop的無縫整合保障了其資料可靠性(HDFS)和海量資料分析的高效能(MapReduce)。

HBase的相關操作

HBase的Shell命令操作

    (1)啟動HBase後,通過shell命令連線到HBase,並使用status命令檢視HBase的執行狀態,確保HBase正常執行。

    (2)通過create命令可以檢視有哪些shell命令以及引數選項。
    (3)通過一個只包含一個列族fam1的表tab1,並通過list指令查看錶是否建立成功。
    (4)使用put命令向表中插入資料,引數分別為表名、行名、列名和值。其中列名前需要列族作為字首,時間戳由系統自動生成。插入成功後通過scan命令查看錶中的資訊。
        以上通過scan命令,檢視車輛卡口表的資料(擷取部分)。其中,LIMIT=>1 表示只顯示第一個行鍵的所有資料(行鍵是通過字典序排列的)。

下面通過表格給出HBase通過shell操作表時,常用的一些命令:



HBase的API呼叫

HBase的Java介面

        通過Eclipse建立一個新工程,並新建一個類,寫程式碼前要引入Hadoop開發所需要的jar包和HBase的jar包,完成上述操作後即可開發HBase應用。
      (1)使用HBaseConfiguration.create()初始化HBase的配置檔案,並指定HBase使用的ZooKeeper的地址。然後例項化HBaseAdmin,該類用於對錶的元資料進行操作並提供了基本的管理操作。
      (2)HBaseAdmin.Create()可以用於建立一張新表,該方法的引數為HTableDescription類,用於描述表明和相關的列族。
      (3)使用HTable.put()可以向表中插入資料,該方法的引數為Put類,該類初始化時可以傳遞一個行鍵,表示向哪一行插入資料,並通過Put.add()新增需要插入表中的資料。
      (4)使用HTable.getScanner()可以獲得某一個列族的所有資料。該方法返回Result類,Result.getFamilyMap()可以獲得以列名為key,值為value的對映表,然後就可以依次讀取相關的內容了。
      (5)使用HBaseAdmin.disableTable()和HBaseAdmin.deleteTable()可以刪除一張表。

HBase的C++呼叫

由於HBase是通過Java實現的,若要通過C++呼叫HBase的介面,目前主流的方法是通過Thrift實現對HBase的訪問。
 Thrift基本概念
Thrift 是 Facebook 的核心框架之一,使不同的開發語言開發的系統可以通過該框架實現彼此的通訊,類似於 webservice ,但是 Thrift 提供了近乎變態的效率和開發的方便性,是 webservice 所不能比擬的,也給分散式開發帶來了極大的方便。Thrift類似於protobuf,但是相比對而言,Thrift支援更廣泛的語言平臺。
 Thrift訪問HBase的步驟
      (1) Thrift對HBase的訪問,首先需要開啟HBase的Thrift服務;
      (2) 用Thrift生成訪問HBase所需的C++檔案;
      (3) 根據Thrift建立規則,建立必要的物件(socket,transport和protocol等),實現訪問HBase的方法;

具體Thrift對HBase的操作,不作詳盡描述。可以參考後續參考閱讀。

總結

本文主要針對HBase的基本概念做了概述性講解,並大致說明了針對Java、C++平臺的API呼叫過程。HBase基於分散式雲處理架構,傾向於大資料的儲存與計算。深入研究與應用HBase也是必然的趨勢。後續希望能夠在專案組或部門之間多探討與應用,以滿足分散式伺服器以及後續專案開發的實際需求。

參考閱讀

[1] O'Reilly:HBase權威指南.
[2]HBase基礎知識 . http://wangmored.iteye.com/blog/1727731
[3]Thrift介紹及應用. http://blog.csdn.net/guxch/article/details/12163519
[4]使用C++訪問HBase. http://blog.chinaunix.net/uid-25808509-id-3269136.html