1. 程式人生 > >HBase框架學習(基礎知識篇)

HBase框架學習(基礎知識篇)

HBase是Apache Hadoop的資料庫,能夠對大型資料提供隨機、實時的讀寫訪問。HBase的目標是儲存並處理大型的資料。HBase是一個開源的,分散式的,多版本的,面向列的儲存模型,它儲存的是鬆散型資料。

一、HBase:BigTable的開源實現

1.1 HBase出現的背景

  (1)隨著資料規模越來越大,大量業務場景開始考慮資料儲存水平擴充套件,使得儲存服務可以增加/刪除,而目前的關係型資料庫更專注於一臺機器。

  (2)海量資料量儲存成為瓶頸,單臺機器無法負載大量資料。

  (3)單臺機器IO讀寫請求成為海量資料儲存時候高併發,大規模請求的瓶頸。

  (4)當資料進行水平擴充套件時候,如何解決資料IO高一致性問題。結合Map/Reduce計算框架進行海量資料的離線分析。

1.2 BigTable成就了HBase

  Google這個神奇的公司以其不保守的態度以學術論文的方式公開了其雲端計算的三大法寶:GFS、MapReduce和BigTable,其中對於BigTable的開源實現HBase則是由Doug Cutting完成的。

  HBase是一個分散式的、面向列的開源資料庫,該技術來源於 Fay Chang 所撰寫的Google論文“Bigtable:一個結構化資料的分散式儲存系統”。就像Bigtable利用了Google檔案系統(File System)所提供的分散式資料儲存一樣,HBase在Hadoop之上提供了類似於Bigtable的能力。HBase是Apache的Hadoop專案的子專案。HBase不同於一般的關係資料庫,它是一個適合於非結構化資料儲存的資料庫。另一個不同的是HBase基於列的而不是基於行的模式。

  HBase中的表一般有這樣的特點:

  (1) 大:一個表可以有上億行,上百萬列

  (2) 面向列:面向列(族)的儲存和許可權控制,列(族)獨立檢索。

  (3) 稀疏:對於為空(null)的列,並不佔用儲存空間,因此,表可以設計的非常稀疏。

PS:什麼是列儲存?

列儲存不同於傳統的關係型資料庫,其資料在表中是按行儲存的,列方式所帶來的重要好處之一就是,由於查詢中的選擇規則是通過列來定義的,因此整個資料庫是自動索引化的。按列儲存每個欄位的資料聚集儲存,在查詢只需要少數幾個欄位的時候,能大大減少讀取的資料量,一個欄位的資料聚集儲存,那就更容易為這種聚集儲存設計更好的壓縮/解壓演算法。下圖講述了傳統的行儲存和列儲存的區別:

1.3 HBase在Hadoop專案中的位置

  與FUJITSU Cliq等商用大資料產品不同,HBase是Google Bigtable的開源實現,類似Google Bigtable利用GFS作為其檔案儲存系統,HBase利用Hadoop HDFS作為其檔案儲存系統;Google執行MapReduce來處理Bigtable中的海量資料,HBase同樣利用Hadoop MapReduce來處理HBase中的海量資料;Google Bigtable利用 Chubby作為協同服務,HBase利用Zookeeper作為對應

  下圖展示了HBase在Hadoop生態系統體系結構中所處的位置:

  上圖描述了Hadoop生態系統中的各層系統。其中,HBase位於結構化儲存層Hadoop HDFS為HBase提供了高可靠性的底層儲存支援Hadoop MapReduce為HBase提供了高效能的計算能力Zookeeper為HBase提供了穩定服務和失效轉移(FailOver)機制

  此外,Pig和Hive還為HBase提供了高層語言支援,使得在HBase上進行資料統計處理變的非常簡單。 Sqoop則為HBase提供了方便的RDBMS資料匯入功能,使得傳統資料庫資料向HBase中遷移變的非常方便。

二、HBase的資料模型

  HBASE中的每一張表,就是所謂的BigTable,一張稀疏表。RowKeyColumnKey 是二進位制值byte[],按字典順序排序;Timestamp 是一個 64 位整數;value 是一個未解釋的位元組陣列byte[]。表中的不同行可以擁有不同數量的成員。即支援“動態模式“模型。

2.1 邏輯模型

  Table & Column Family

  HBase以表的形式儲存資料。表有行和列組成。列劃分為若干個列族(row family),如下圖所示:

  Ø  Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序

  Ø  Timestamp: 時間戳,每次資料操作對應的時間戳,可以看作是資料的version number

  Ø  Column Family:列簇,Table在水平方向有一個或者多個Column Family組成,一個Column Family中可以由任意多個Column組成,即Column Family支援動態擴充套件,無需預先定義Column的數量以及型別,所有Column均以二進位制格式儲存,使用者需要自行進行型別轉換。

2.2 物理模型

 (1)物理儲存表示

  將邏輯模型中的一個Row分割為根據Column family儲存的物理模型,如下圖所示:

 (2)Table & Region

  當Table隨著記錄數不斷增加而變大後,會逐漸分裂成多份splits,成為regions,一個region由[startkey,endkey)表示,不同的region會被Master分配給相應的RegionServer進行管理,如下圖所示:

  由上可知,HBase的伸縮性主要依賴於其可分裂的HRegion可伸縮的分散式檔案系統HDFS,下面介紹一下HBase如何實現伸縮性:

  ①HBase中資料以HRegion為單位進行管理,也就是說應用程式如果想要訪問一個數據,必須先找到HRegion,然後將資料讀寫操作提交給HRegion,由HRegion完成儲存層面的資料操作。

  ②每個HRegion中儲存一段Key區間(例如:[Key1,Key2))的資料,HRegionServer是物理伺服器,每個HRegionServer上可以啟動多個HRegion例項。當一個HRegion中寫入的資料太多,達到配置的閥值時,HRegion會分裂成兩個HRegion,並將HRegion在整個叢集中進行遷移,以使HRegionServer的負載均衡。

  ③所有的HRegion的資訊都(例如:儲存的Key值區間、所在HRegionServer的IP地址和埠號等)記錄在HMaster伺服器上。同時為了保證高可用,HBase啟動了多個HMaster,並通過ZooKeeper(一個支援分散式一致性的資料管理服務)選舉出一個主伺服器,通過這個主HMaster伺服器獲得Key值所在的HRegionServer,最後請求該HRegionServer上的HRegion例項,獲得需要的資料。其具體的資料定址訪問流程如下圖所示:

hbase scuduling

三、HBase的系統架構

3.1 Client

  包含訪問hbase的介面,Client維護著一些cache來加快對hbase的訪問,比如regione的位置資訊。

3.2 ZooKeeper

  (1) 保證任何時候,叢集中只有一個master

  (2) 存貯所有Region的定址入口。

  (3) 實時監控Region Server的狀態,將Region server的上線和下線資訊實時通知給Master

  (4) 儲存Hbase的schema,包括有哪些table,每個table有哪些column family

3.3 HMaster

  (1)為Region Server分配Region

  (2)負責Region Server的負載均衡

  (3)發現失效的Region Server並重新分配其上的Region

  (4)GFS上的垃圾檔案回收

  (5)處理Schema更新請求

  HMaster主要作用在於,通過HMaster維護系統表-ROOT-,.META.,記錄regionserver所對應region變化資訊。此外還負責監控處理當前hbase cluster中regionserver狀態變化資訊。

PS:兩張神奇的表:-ROOT-和.META

① .META.:記錄了使用者表的Region資訊,.META.可以有多個regoin ② -ROOT-:記錄了.META.表的Region資訊,-ROOT-只有一個region

Zookeeper中記錄了-ROOT-表的location

Client訪問使用者資料之前需要首先訪問Zookeeper,然後訪問-ROOT-表,接著訪問.META.表,最後才能找到使用者資料的位置去訪問:

3.4 Region Server

  (1)Region Server維護HMaster分配給它的Region,處理對這些Region的IO請求

  (2)Region Server負責切分在執行過程中變得過大的Region

  可以看出,client 訪問hbase 上資料的過程並不需要master 參與,定址訪問zookeeper 和region server,資料讀寫訪問regioneserver。HRegionServer主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料,是HBase中最核心的模組。

參考資料

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。