本節書摘來異步社群《mapreduce 2.0源碼分析與程式設計實戰》一書中的第2章,第2.1節,作者: 王曉華 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
hbase實戰
twitbase存儲3種簡單的核心資料元素,即使用者(user)、推帖(twit)和關系(relationship)。使用者是twitbase的中心。使用者登入進入應用系統,維護使用者資訊,通過發帖與其他使用者互動。推帖是twitbase中使用者公開發表的短文。推帖是使用者間互動的主要模式。使用者通過互相轉發産生對話。所有互動的“粘合劑”就是關系。關系連接配接使用者,使使用者很容易讀到其他使用者的推帖。本章關注點是使用者和推帖,下一章将讨論關系。
關于java
本書絕大部分代碼都是用java編寫的。有時我們使用僞代碼來幫助了解概念,但是工作代碼是java。使用hbase,java是現實的選擇。整個hadoop系列,包括hbase,都使用java。hbase用戶端函數庫是java,mapreduce函數庫也是java。hbase的部署需要優化jvm性能。但是可以使用非java和非jvm的語言來通路hbase,第6章會讨論這些内容。
現在開始搭建twitbase,為存儲使用者奠定一個基礎。hbase是一個在表裡存儲資料的資料庫,是以我們從建立users表開始。首先進入hbase shell:

shell打開一個到hbase的連接配接,給出提示符。在shell提示符上,建立你的第一張表:
可以想到'users'是表的名字,但是'info'是什麼呢?像關系型資料庫裡的表一樣,hbase的表也是按照行(row)和列(column)來組織的。hbase中的列和關系型資料庫中的有些不同。hbase中的列組成列族(column family)。info就是users表的一個列族。hbase中的表必須至少有一個列族。它們之中,列族直接影響hbase資料存儲的實體特性。是以,建立表時必須至少指定一個列族。表建立後列族還可以更改,但是這麼做很麻煩。後面我們會詳細讨論列族,現在隻需要知道users表足夠簡單,隻有一個列族,就可以了。
如果你熟悉關系型資料庫,會馬上注意到,hbase建立表時沒提到任何列或者資料類型。除了列族名字,hbase什麼也不需要。這就是hbase經常被稱作無模式資料庫的原因。
你可以要求hbase列出所有已建立的表來驗證users表已經建立成功:
list指令可以顯示存在的表,hbase也可以提供表的更多細節。使用describe指令可以看到這個表的所有的預設參數:
shell顯示表有兩類屬性資訊:表的名字和列族的清單。每個列族有許多相應的配置資訊細節,這些就是我們前面提到的實體特性。現在先不管這些細節,我們随後研究它們。
hbase shell
雖然hbase shell主要用于管理任務,但它擁有豐富的特性。它用jruby實作,可以使用整個java用戶端api。你可以使用help指令進一步發掘shell的功能。
盡管shell很好用,但是誰會願意用shell指令實作twitbase呢?聰明的hbase開發人員知道這一點,他們為hbase提供了一個全面的java用戶端庫。也有面向其他語言的類似的api,第6章會讨論。現在我們使用java。打開users表連接配接的java代碼如下所示:
類似于shell的做法,構造函數htable讀取預設配置資訊來定位hbase。然後定位之前你建立的users表,傳回一個句柄。
你也可以傳遞一個定制的配置對象給htable對象:
這等同于讓htable對象自己建立配置資訊對象。你可以像下面這樣設定參數來定制配置資訊:
hbase用戶端配置資訊
hbase用戶端應用需要有一份hbase配置資訊來通路hbase——zookeeper quorum位址。你可以手工設定這個配置如下:
zookeeper以及用戶端與hbase叢集之間的互動會在下一章深入研究分布式hbase存儲時讨論到。現在你隻需要知道hbase配置資訊可以通過兩種方式擷取,一種是java用戶端從類路徑裡的hbase-site.xml檔案裡擷取配置資訊,另一種是通過在連接配接中顯式設定配置資訊來擷取。如果你沒有指定配置資訊,就像示例代碼裡那樣,用戶端就會使用預設配置資訊,把localhost作為zookeeper quorum 位址。單機模式中,指的就是你用來驗證本書内容的機器,這正是你需要的配置資訊。
建立一張表執行個體是個開銷很大的操作,需要占用一些網絡資源。與直接建立表句柄相比,使用連接配接池更好一些。連接配接從連接配接池裡配置設定,然後再傳回到連接配接池。實踐中,使用htablepool比直接使用htable更為常見:
當你完成工作關閉表時,連接配接資源會傳回到連接配接池裡。
沒有資料的表是沒有用的,現在我們存儲一些資料。