HBase的特徵和優點

chenfeng發表於2015-12-09

Hbase是執行在Hadoop上的NoSQL資料庫,它是一個分散式的和可擴充套件的大資料倉儲,也就是說HBase能夠利用HDFS的分散式處理模式,並從Hadoop的MapReduce程式模型中獲益。這意味著在一組商業硬體上儲存許多具有數十億行和上百萬列的大表。除去Hadoop的優勢,HBase本身就是十分強大的資料庫,它能夠融合key/value儲存模式帶來實時查詢的能力,以及通過MapReduce進行離線處理或者批處理的能力。總的來說,Hbase能夠讓你在大量的資料中查詢記錄,也可以從中獲得綜合分析報告。

谷歌曾經面對過一個挑戰的問題:如何能在整個網際網路上提供實時的搜尋結果?答案是它本質上需要將網際網路快取,並重新定義在這樣龐大的快取上快速查詢的新方法。為了達到這個目的,定義如下技術:

  • 谷歌檔案系統GFS:可擴充套件分散式檔案系統,用於大型的、分散式的、資料密集型的應用程式。
  • BigTable:分散式儲存系統,用於管理被設計成規模很大的結構化資料:來自數以千計商用伺服器的PB級別的資料。
  • MapReduce:一個程式模型,用於處理和生成大資料集的相關實現。

在谷歌釋出這些技術的文件之後, 不久以後我們就看到了它們的開源實現版本 ,就在2007年,Mike Cafarella釋出了BigTable開源實現的程式碼,他稱其為HBase,自此,HBase成為Apache的頂級專案,並執行在Facebook,Twitter,Adobe……僅舉幾個例子。

HBase不是一個關係型資料庫,它需要不同的方法定義你的資料模型,HBase實際上定義了一個四維資料模型,下面就是每一維度的定義:

  • 行鍵:每行都有唯一的行鍵,行鍵沒有資料型別,它內部被認為是一個位元組陣列。
  • 列簇:資料在行中被組織成列簇,每行有相同的列簇,但是在行之間,相同的列簇不需要有相同的列修飾符。在引擎中,HBase將列簇儲存在它自己的資料檔案中,所以,它們需要事先被定義,此外,改變列簇並不容易。
  • 列修飾符:列簇定義真實的列,被稱之為列修飾符,你可以認為列修飾符就是列本身。
  • 版本:每列都可以有一個可配置的版本數量,你可以通過列修飾符的制定版本獲取資料。

thhaines_hbase_1_1_01

Figure 1.  HBase Four-Dimensional Data Model

如圖1中所示,通過行鍵獲取一個指定的行,它由一個或多個列簇構成,每個列簇有一個或多個列修飾符(圖1中稱為列),每列又可以有一個或多個版本。為了獲取指定資料,你需要知道它的行鍵、列簇、列修飾符以及版本。當設計HBase資料模型時,對考慮資料是如何被獲取是十分有幫助的。你可以通過以下兩種方式獲得HBase資料:

  • 通過他們的行鍵,或者一系列行鍵的表掃描。
  • 使用map-reduce進行批操作

這種雙重獲取資料的方法使得HBase變得十分強大,典型地,在Hadoop中儲存資料意味著它對離線或批處理方式分析是有益的(尤其是批處理分析),但是,對實時獲取是不必要的。HBase通過key/value儲存來支援實時分析,以及通過map-reduce支援批處理分析。讓我們首先來看實時資料獲取,作為key/value儲存,key是行鍵,value是列簇的集合,如圖2所示。

thhaines_hbase_1_1_02

Figure 2.  HBase as a Key/Value Store

如你在圖2中看到的,key是我們所提到過的行鍵,value是列簇的集合。你可以通過key檢索到value,或者換句話說,你可以通過行鍵“得到”行,或者你能通過給定起始和終止行鍵檢索一系列行,這就是前面提到的表掃描。你不能實時的查詢一個列的值,這就引出了一個重要的話題:行鍵的設計。

有兩個原因令行鍵的設計十分重要:

  • 表掃描是對行鍵的操作,所以,行鍵的設計控制著你能夠通過HBase執行的實時/直接獲取量。
  • 當在生產環境中執行HBase時,它在HDFS上部執行,資料基於行鍵通過HDFS,如果你所有的行鍵都是以user-開頭,那麼很有可能你大部分資料都被分配一個節點上(違背了分散式資料的初衷),因此,你的行鍵應該是有足夠的差異性以便分散式地通過整個部署。

你定義行鍵的方式取決於你想怎樣存取那些行。如果你想以使用者為基礎儲存資料,那麼一個策略是利用位元組佇列在HBase中儲存行鍵,所以我們可以建立一個使用者ID的雜湊(例如MD5或SHA-1),然後在雜湊後面附上時間(long型別)。使用雜湊有兩個重點:(1)是它能夠將value分散開,資料能夠分散式地通過簇,(2)是它確保key的長度是一致的,以更加容易在表掃描中使用。

講了足夠多的理論,下面部分向你展示如何搭建HBase環境,並如何通過命令列使用。

你可以從Apache網站下載HBase,在寫本文時,最新的版本是0.98.5,HBase團隊推薦你在UNIX/Linux環境下安裝HBase,如果你想在Windows下執行,你需要先安裝Cygwin,並在這上執行HBase。當你下載完這些檔案,解壓到硬碟上。此外,你還需要安裝Java環境,如果你還沒有,從Oracle網站下載Java環境。在環境配置中新增名為HBASE_HOME的變數,值為你解壓HBase檔案的根目錄,隨後,執行bin資料夾下的start-hbase.sh指令碼,它會在下面目錄輸出日誌檔案:

$HBASE_HOME/logs/

你可以在瀏覽器中輸入下面URL測試是否安裝正確:

http://localhost:60010

如果安裝正確,你應該看到下面介面。

thhaines_hbase_1_1-03

Figure 3.  HBase Management Screen

讓我們開始用命令列操作HBase,在HBase bin目錄下執行下面命令:

./hbase shell

你應該看到如下類似的輸出:

建立一個名為PageViews的表,並具有名為info的列簇:

每張表至少要有一個列簇,因此我們建立了info,現在,看看我們的表,執行下面list命令:

如你所見,list命令返回一個名為PageViews的表,我們可以通過describe命令得到表的更多資訊:

Describe命令返回表的詳細資訊,包括列簇的列表,這裡我們建立的僅有一個:info,現在為表新增以下資料,下面命令是在info中新增新的行:

Put命令插入一條行鍵為rowkey1的新紀錄,指定在info下的page列,插入值為/mypage的記錄,我們隨後可以通過get命令通過行鍵rowkey1查詢到這條記錄:

你可以看到列info:page,或者更多具體的列,其值為/mypage,並帶有時間戳表明該條記錄是什麼時候插入的。讓我們在做表掃描之前再新增一行:

現在我們有兩行記錄了,讓我們查詢出PageViews表的所有記錄:

如前面所提到的,我們不能查詢本身,但是我們可以對錶進行scan操作,如果你執行scan table命令,它會返回表中所有行,這很有可能不是你想要做的。你可以給出行的範圍來限制返回的結果,讓我們插入一帶有s開頭行鍵的新記錄:

現在,如果我增加點限制,想查詢行鍵在r和s之間的記錄,可以使用如下結構:

這個scan返回了僅有s開頭的記錄,這個類比是基於全行鍵上的,所以rowkey1比r大,所有它被返回了。另外,scan的結果包含了所指範圍的STARTROW,但不包含ENDROW,注意,ENDROW不是必須指定的,如果我們執行相同查詢只給出了STARTROW,那麼我們會得到行鍵比r大的所有記錄。

HBase是一種NoSQL,通常被稱為Hadoop Database,它是開源並基於Google Big Table白皮書,HBase執行在HDFS之上,因此使它具有高度可擴充套件性,並支援Hadoop map-reduce程式設計模型。HBase有兩種訪問方式:通過行鍵進行隨機訪問;通過map-reduce離線或批訪問。

本文講述了HBase的特徵和它的優點,並簡要回顧了行鍵設計的重點之處,它還向你展示瞭如何在本地配置HBase環境,使用命令建立表、插入資料、檢索指定行以及最後如何進行scan操作。

下篇文章,“使用Java開發HBase”將展示HBase的程式介面並舉例介紹如何使用Java來操作HBase。在本系列的最後一篇文章“使用MapReduce進行HBase資料分析”中,我們將介紹如何使用map-reduce進行離線/批處理。

相關文章