1. 程式人生 > 實用技巧 >大資料學習(13)—— HBase入門

大資料學習(13)—— HBase入門

從這一篇起,開始介紹HBase相關知識。還是一樣,大資料的學習,獲取官網知識很重要。官網看這裡Apache HBase

HBase簡介

ApacheHBase™ is theHadoopdatabase, a distributed, scalable, big data store.

Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project's goal is the hosting of very large tables -- billions of rows X millions of columns -- atop clusters of commodity hardware. Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google's

Bigtable: A Distributed Storage System for Structured Databy Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.

上面是官網的介紹。從介紹裡可以看出,HBase是Apache的頂級專案,可以稱為Hadoop的資料庫,是一個分散式、可擴充套件的大資料儲存。

HBase跟傳統關係型資料庫的定位非常不同,它能儲存包含十億級別的行和百萬級別的列的表,就算效能強如oracle,在這個規模面前也要歇菜。HBase的理論基礎是google的論文Bigtable,這是奠定大資料基礎的三篇google論文之一。

潑一盆冷水

準確地講,HBase更像是一個數據儲存,而不是資料庫,因為它缺少很多傳統關係型資料庫的特徵。當然,它也不適用於解決所有問題。如果想使用HBase,那麼得滿足下面幾個條件:

  • 首先,你要有足夠大的資料量。十億往上走的資料量,比較適合使用HBase。要是隻有幾百萬條記錄,那不如用傳統關係型資料庫,因為這點資料量太小了,只會使用到HBase叢集的一個節點,其他節點都是閒置。
  • 其次,確保你的程式碼不需要使用傳統關係型資料庫提供的任何特性依然可以執行。基於關係型資料庫開發的應用不可能僅僅替換一下驅動,就能移植到HBase裡,這得重新設計。
  • 最後,你還得有足夠的伺服器。即便是HBase用來儲存資料的HDFS,它需要的三副本和NameNode至少要佔用5臺伺服器,更不用說HBase還有自己的元件需要部署了。

雖然HBase在膝上型電腦上也能執行,但那隻能作為開發環境,生產環境就不要想了。

HBase架構

不廢話,先上圖。

從圖片裡可以看到虛線以上是HBase的元件和角色,虛線以下是HDFS。再看看官網裡關於架構描述的目錄Architecture

我把幾種主要的角色具體做啥事介紹一下。

Zookeeper

一般來說,zookeeper起到高可用選主的作用,但是在HBase架構裡,它還負責儲存元資料,官方原話——hbase:metais stored in ZooKeeper。

Client

HBase客戶端首先去查詢zookeeper中的元資料資訊,找到儲存所需資料的Region。這裡先要明確一些概念,Region相當於關係型資料庫中的表,Store相當於列族(列族是HBase管理的最小單元,包含多個相關的列)。

定位到需要的Region後,Client直接連線到對應的RegionServer而不是通過Master來完成讀寫請求。這些資訊會快取到客戶端,隨後的請求就不會再有查詢的過程了。但是當RegionServer宕機或者是Master根據負載均衡策略來調整region的時候,客戶端需要重新通過元資料來決定訪問哪個region。

Master

HMaster是Master Server的實現,真的,你啟動Master的時候,用jps檢視程序,程序名就是HMaster。Master負責監控叢集中所有的ReginServer例項,它為元資料變化提供操作介面。在一個分散式叢集中,Master往往執行在NameNode節點上。

RegionServer

HRegionServer是RegionServer的實現,不信你用jps看看。它負責管理和服務regions。在一個分散式叢集中,RegionServer執行在DataNode節點上。

Regions

Regions儲存表的資料,一張表的資料可以分散在多個region中。每個region包含多個用來儲存列族的Store。它的結構樹長這樣:

Table                    (HBase table)
    Region               (Regions for the table)
        Store            (Store per ColumnFamily for each Region for the table)
            MemStore     (MemStore for each Store for each Region for the table)
            StoreFile    (StoreFiles for each Store for each Region for the table)
                Block    (Blocks within a StoreFile within a Store for each Region for the table)

HBase資料模型

HBase的資料儲存在表裡,它也有行和列。這個說法是參照關係型資料庫的結構來講的,這不是一個合適的類比。但這個說法有助於理解HBase是一個多維表格。

Table

HBase的表包含多條記錄。

Row

HBase的一行記錄包含行鍵、列名以及與之相關的值。每行記錄按照行鍵的字典序排序。正因為如此,行鍵的設計就非常重要。設計行鍵的時候,要儘量保證相關的記錄它們的行鍵近似,這樣查詢的時候可以利用範圍查詢。通常的行鍵模式,使用網站的域名,域名的幾個單詞要倒著排,這樣的好處是,不同的域名不會排在一起。

Column

HBase中的列包含列族和列名,中間用冒號分割。我用中文舉個例子,像這樣,個人資訊:學歷,個人資訊:姓名。這個例子裡,個人資訊是列族,學歷、姓名、性別、專業這些相關的欄位是列名。

Column Family

列族把一系列的欄位和值組合起來,這個做法基於效能原因的考慮。每個列族都有一些儲存屬性,比方說欄位的值要不要放在快取裡、資料如何壓縮、行鍵怎麼編碼等等。每行記錄都包含相同的列族,儘管有些列族裡啥也沒存。

Column Qualifier

列的修飾符,我們可以稱之為列名,它是列族之下的具體索引,用來獲取某個特定的值。列名和列族之間用冒號分割。列族是在定義表的時候就確定下來了,但是每條記錄的列名可變,甚至非常不同。

cells

它是儲存資料的最小單位。在HBase中,唯一確定一個單元格,需要行鍵+時間戳+列族+列名,它裡面存放的是無格式的位元組陣列,如下圖。

這個時間戳有4個值,以關係型資料庫的觀點來看,它有4條記錄。但在HBase中,它實際上是一條記錄,是同一個行鍵不同版本的值。

Timestamp

在寫入一個值的時候,同時會寫入一個時間戳,它是區分同一個版本資料的標識。預設情況下,時間戳反映了寫資料時RegionServer的時刻,你也可以指定一個不同值的時間戳。