天天看點

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

本節書摘來異步社群《mapreduce 2.0源碼分析與程式設計實戰》一書中的第1章,第1.3節,作者: 王曉華 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

hbase實戰

hbase搭建在apache hadoop和apache zookeeper上面。就像hadoop家族其他産品一樣,它是用java編寫的。hbase可以以3種模式運作:單機、僞分布式和全分布式。下面我們将使用的是單機模式。這意味着在一個java程序裡運作hbase的全部内容。這種通路模式用于研究hbase和做本地開發。

僞分布式模式需要在一台機器上運作多個java程序。最後的全分布模式需要一個伺服器叢集。這兩種模式需要安裝相關聯的軟體包以及合理地配置hbase。這些内容将在第9章讨論。

hbase設計運作在nix系統上,代碼和書中的指令都是為nix系統設計的。如果你使用windows系統,最好的選擇是安裝一個linux虛拟機。

關于java的解釋

hbase基本上用java編寫,隻有幾個部件不是,最優先支援的語言自然是java。如果你不是java開發員,在學習hbase時需要學習一些java技能。本書的目标是指導你如何有效地使用hbase,很大篇幅内容關于如何使用api,它們都是java的。是以,辛苦一點兒吧。

1.3.1 快速安裝

以單機模式運作hbase,過程很簡單。你可以選擇apache hbase 0.92.1版本,使用tar檔案包進行安裝。第9章會讨論其他各種發行版。如果你選擇不同于apache hbase 0.92.1的其他版本,也是可以使用的。本書的例子基于hbase 0.92.1版本(和cloudera cdh4),其他api相容的版本應該都可以正常工作。

hbase需要系統安裝java運作環境(jre)。生産系統環境我們推薦oracle的java軟體包。hadoop和hbase社群測試了一些jre版本,寫作本書時hbase 0.92.1或cdh4的推薦版本是 java 1.6.0_311。java 7至今沒有測試,是以并不推薦。安裝hbase之前先在系統上安裝java。

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

上述步驟從apache鏡像站點下載下傳和解壓了hbase的tar檔案包。友善起見,建立一個環境變量指向這個目錄,後面會比較省事。把它寫入環境變量檔案,以便每次打開shell時不用重複設定。書中後面都會用到hbase_home:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

如果可以,把$hbase_home/bin放進path變量,以便下次你可以直接執行hb<code>ase而不是$hbase_home/bin/</code>hb``ase。

全部做完後,單機模式的hbase就安裝成功了。hbase的配置資訊主要在兩個檔案裡:hbase-env.sh 和 hbase-site.xml。這兩個檔案存放在/etc/hbase/conf/目錄下。單機模式的預設設定裡,hbase寫資料到目錄/tmp 下,但是該目錄不是長期儲存資料的地方。你可以編輯hbase-site.xml檔案,添加下面配置資訊來将目錄改到你指定的地方:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

安裝完成,hbase已經啟動,現在開始使用hbase。

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

圖1-2 hbase master狀态頁面。該頁面可以看到hbase的健康狀态。也可以了解資料的分布,執行一些基本的管理任務,但是大部分管理任務不是在這個頁面完成的。第10章将教你更多hbase運維知識

你可以使用hbase shell,通過指令行方式和hbase進行互動。本地安裝和叢集安裝都采用同樣的shell方式。hbase shell是一個封裝了java用戶端api的jruby應用軟體,有兩種運作方式:互動模式和批處理模式。互動模式用于對hbase進行随時通路互動,批處理模式主要通過shell腳本進行程式化互動或者用于加載小檔案。在本章節我們使用互動模式。

jruby和jvm語言

不熟悉java的人可能被jruby的概念搞迷糊了。jruby是在java運作時上面的ruby程式設計語言的實作。除了正常的ruby文法,jruby支援通路java對象和函數庫。jvm上不僅僅隻是java和jruby。jython是jvm上python的實作,還有一些完全不同的語言,如clojure和scala。所有這些語言都可以通過java用戶端api來通路hbase。

讓我們開始使用互動模式。在終端中執行hbase shell指令啟動shell。shell可以支援指令自動補全和指令文檔内聯通路:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

走到這一步,可以确認java和hbase函數庫已經安裝成功。為了最終驗證,可以試試列出hbase中所有表的指令。這個動作執行了一個全程請求,從用戶端應用到hbase伺服器,然後傳回。在shell提示符下,輸入list然後按下Enter鍵。你應該看到輸出0個結果,以及接下來的提示符:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

完成安裝和驗證後,現在建立表并存儲一些資料。

hbase使用表作為頂級結構來存儲資料。寫資料到hbase,就是寫資料到表。現在開始,建立一個有一個列族的表,名字是 mytable。是的,列族(别着急,後面會解釋這個術語)。現在建立表:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

1.寫資料

表建立後,現在寫入一些資料。我們往表裡寫入字元串hello hbase。按hbase的說法,我們這麼說,“在'mytable'表的'first'行中的'cf:message'列對應的資料單元中插入位元組數組'hello hbase'”能聽懂嗎?下一章我們會解釋所有這些術語。現在,執行寫入指令:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

簡單吧。hbase存儲數字的方式和存儲字元串一樣。繼續多增加幾個值,如下:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

現在表裡有3行和3個資料單元。注意,在使用列的時候你并沒有提前定義這些列,你也沒有定義往每個列裡存儲的資料的類型。這就是nosql粉絲們所說的,hbase是一種無模式(schema-less)的資料庫。如果寫入資料後不能讀取出來也是沒有用的,現在讀回資料看看。

2.讀資料

hbase有兩種方式讀取資料:get和scan。你肯定敏銳地注意到了,hbase存儲資料的指令是put。和put相對應,讀取一行的指令是get。還記得我們說過,hbase除了鍵值api還有一些特别之處嗎?scan就是這個特别所在。第2章會介紹scan是如何工作的以及為什麼它很重要,同時會重點關注如何使用它。

現在執行get:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

如上所示,你得到了第一行。shell輸出了該行所有資料單元,按列組織,輸出值還附帶時間戳。hbase可以存儲每個資料單元的多個時間版本。存儲的版本數量預設值是3個,但可以重新設定。讀取的時候,除非特别指定,否則預設傳回最新時間版本。如果你不希望存儲多個時間版本,可以設定hbase隻存儲一個版本,但是絕不要禁用這個特性。

使用scan指令,你會得到多行資料。但是要小心,我們必須提醒你,除非特别指定,否則該指令會傳回表裡的所有行。現在執行scan:

《MapReduce 2.0源碼分析與程式設計實戰》一1.3 你好HBase

傳回了所有資料。注意觀察hbase傳回行的順序,是按行的名字排序的。hbase稱之謂行鍵(rowkey)。hbase還有很多技巧,但是所有其他東西都建立在你剛才使用的基本概念上。好好體會一下。