hmaster主要負責table和region管理工作:
1. 管理使用者對table的增、删、改、查操作
2. 管理hregionserver的負載均衡,調整region分布
3. 在region split後,負責新region的配置設定
4. 在hregionserver停機後,負責失效hregionserver 上的regions遷移
hregionserver主要負責響應使用者i/o請求,向hdfs檔案系統中讀寫資料。
hbase工作原理:
hregionserver内部管理了一系列hregion對象,每個hregion對應了table中的一個region,hregion中由多個hstore組成。每個hstore對應了table中的一個column family的存儲,可以看出每個column family其實就是一個集中的存儲單元,是以最好将具備共同io特性的column放在一個columnfamily中,這樣最高效。
hstore存儲是hbase存儲的核心了,其中由兩部分組成,一部分是memstore,一部分是storefiles。memstore是sortedmemory buffer,使用者寫入的資料首先會放入memstore,當memstore滿了以後會flush成一個storefile(底層實作是hfile),當storefile檔案數量增長到一定門檻值,會觸發compact合并操作,将多個storefiles合并成一個storefile,合并過程中會進行版本合并和資料删除,是以可以看出hbase其實隻有增加資料,所有的更新和删除操作都是在後續的compact過程中進行的,這使得使用者的寫操作隻要進入記憶體中就可以立即傳回,保證了hbase i/o的高性能。當storefiles compact後,會逐漸形成越來越大的storefile,當單個storefile大小超過一定門檻值後,會觸發split操作,同時把目前region split成2個region,父region會下線,新split出的2個孩子region會被hmaster配置設定到相應的hregionserver上,使得原先1個region的壓力得以分流到2個region上。
在了解了上述hstore的基本原理後,還必須了解一下hlog的功能,因為上述的hstore在系統正常工作的前提下是沒有問題的,但是在分布式系統環境中,無法避免系統出錯或者當機,是以一旦hregionserver意外退出,memstore中的記憶體資料将會丢失,這就需要引入hlog了。每個hregionserver中都有一個hlog對象,hlog是一個實作writeahead log的類,在每次使用者操作寫入memstore的同時,也會寫一份資料到hlog檔案中,hlog檔案定期會滾動出新的,并删除舊的檔案(已持久化到storefile中的資料)。當hregionserver意外終止後,hmaster會通過zookeeper感覺到,hmaster首先會處理遺留的 hlog檔案,将其中不同region的log資料進行拆分,分别放到相應region的目錄下,然後再将失效的region重新配置設定,領取 到這些region的hregionserver在load region的過程中,會發現有曆史hlog需要處理,是以會replay hlog中的資料到memstore中,然後flush到storefiles,完成資料恢複。
hbase高可用實作方式:
hbase同樣分為active和standby,把資料存儲在zookeeper,可以啟動兩個或多個hmaster服務程序,第一個啟動的做為hbase活動節點,其餘的作為備用節點。如果一台故障,zookeeper會選擇出備用節點成為活動節點,讓他接管故障的活動節點任務,保證總有一個master運作。
二、hbase安裝與配置(每台都要配置)
1.安裝配置
1
2
3
4
5
<code> </code><code># tar zxvf hbase-1.0.1.1-bin.tar.gz</code>
<code> </code><code># mv hbase-1.0.1.1 /opt</code>
<code> </code><code># vi hbase-env.sh</code>
<code> </code><code>export</code> <code>java_home=</code><code>/usr/local/jdk1</code><code>.7</code>
<code> </code><code>export</code> <code>hbase_manages_zk=</code><code>false</code> <code>#關閉通過内置zookeeper管理hbase</code>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<code> </code><code># vi hbase-site.xml</code>
<code> </code><code><configuration></code>
<code> </code><code><!--hbase資料目錄位置--></code>
<code> </code><code><property></code>
<code> </code><code><name>hbase.rootdir<</code><code>/name</code><code>></code>
<code> </code><code><value>hdfs:</code><code>//hcluster/hbase</code><code><</code><code>/value</code><code>></code>
<code> </code><code><</code><code>/property</code><code>></code>
<code> </code><code><!--啟用分布式叢集--></code>
<code> </code><code><name>hbase.cluster.distributed<</code><code>/name</code><code>></code>
<code> </code><code><value></code><code>true</code><code><</code><code>/value</code><code>></code>
<code> </code><code><!--預設hmaster http通路端口--></code>
<code> </code><code><name>hbase.master.info.port<</code><code>/name</code><code>></code>
<code> </code><code><value>16010<</code><code>/value</code><code>></code>
<code> </code><code><</code><code>/property</code><code>></code>
<code> </code><code><!--預設hregionserver http通路端口--></code>
<code> </code><code><property></code>
<code> </code><code><name>hbase.regionserver.info.port<</code><code>/name</code><code>></code>
<code> </code><code><value>16030<</code><code>/value</code><code>></code>
<code> </code><code><!--不使用預設内置的,配置獨立的zk叢集位址--></code>
<code> </code><code><name>hbase.zookeeper.quorum<</code><code>/name</code><code>></code>
<code> </code><code><value>hslave0,hslave1,hslave2<</code><code>/value</code><code>></code>
<code> </code><code><</code><code>/configuration</code><code>></code>
<code> </code><code># vi regionservers </code>
<code> </code><code>hslave0</code>
<code> </code><code>hslave1</code>
<code> </code><code>hslave2</code>
2. 配置系統變量
<code> </code><code># vi /etc/profile</code>
<code> </code><code>hbase_home=</code><code>/opt/hbase-1</code><code>.0.1.1</code>
<code> </code><code>path=$path:$hbase_home</code><code>/bin</code>
<code> </code><code>export</code> <code>hbase_home path</code>
<code> </code><code># source /etc/profile</code>
3. 啟動hbase
分别在hmaster0和hmaster1啟動hmaster:
<code> </code><code># start-hbase.sh</code>
分别在 hslave0/1/2啟動hregionserver:
<code> </code><code># hbase-daemon.sh start regionserver</code>
4. 檢查是否啟動成功
在主備節點檢視有hmaster程序說明成功:
<code> </code><code>[root@hmaster0 ~]</code><code># jps</code>
<code> </code><code>2615 dfszkfailovercontroller</code>
<code> </code><code>30027 resourcemanager</code>
<code> </code><code>29656 namenode</code>
<code> </code><code>2841 hmaster</code>
<code> </code><code>8448 jps</code>
在regionserver節點檢視有hregionserver程序說明成功:
<code> </code><code>[root@hslave0 ~]</code><code># jps</code>
<code> </code><code>11391 nodemanager</code>
<code> </code><code>11213 datanode</code>
<code> </code><code>11298 journalnode</code>
<code> </code><code>10934 quorumpeermain</code>
<code> </code><code>12571 hregionserver</code>
<code> </code><code>7005 jps</code>
通過通路web頁面檢視:
5. hbase shell常用操作指令
根據下面tb1表的結構來示範hbase增删改查用法:
name
info
address
sex
age
zhangsan
man
beijing
lisi
woman
shanghai
# hbase shell #進入字元頁面
5.1 建立表tb1,并有兩個列族name、info和address,info列族下有sex和age列
<code> </code><code>hbase(main):024:0> create </code><code>'tb1'</code><code>,</code><code>'name'</code><code>,</code><code>'info'</code><code>,</code><code>'address'</code>
5.2 檢視表結構
<code> </code><code>hbase(main):025:0> describe </code><code>'tb1'</code>
5.3 列出所有表
<code> </code><code>hbase(main):025:0> list</code>
5.4 插入幾條記錄
<code> </code><code>hbase(main):028:0> put </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code><code>,</code><code>'info:sex'</code><code>,</code><code>'22'</code>
<code> </code><code>hbase(main):039:0> put </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code><code>,</code><code>'info:age'</code><code>,</code><code>'man'</code>
<code> </code><code>hbase(main):031:0> put </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code><code>,</code><code>'address'</code><code>,</code><code>'beijing'</code>
<code> </code><code>hbase(main):046:0> put </code><code>'tb1'</code><code>,</code><code>'lisi'</code><code>,</code><code>'info:age'</code><code>,</code><code>'woman'</code>
<code> </code><code>hbase(main):047:0> put </code><code>'tb1'</code><code>,</code><code>'lisi'</code><code>,</code><code>'info:sex'</code><code>,</code><code>'23'</code>
<code> </code><code>hbase(main):048:0> put </code><code>'tb1'</code><code>,</code><code>'lisi'</code><code>,</code><code>'address'</code><code>,</code><code>'shanghai'</code>
5.5 檢視所有記錄(全表掃描)
<code> </code><code>hbase(main):040:0> scan </code><code>'tb1'</code>
<code> </code><code>row column+cell </code>
<code> </code><code>zhangsan column=address:,timestamp=1435129009088,value=beijing </code>
<code> </code><code>zhangsan column=info:age,timestamp=1435129054098, value=</code><code>man</code>
<code> </code><code>zhangsan column=info:sex,timestamp=1435128714392, value=22</code>
說明:
row:行,用來檢索記錄的主鍵。
column family:列族,是表的一部分,必須在建立表時定義,可以看到列名是以列族作為字首,一個列族可以有多個列(column)。
cell:存儲機關,存儲實際資料,也就是所看到的value,cell中沒有資料類型,全部是位元組碼形式存儲。
timestamp:時間戳,可以看做是資料版本号,hbase寫時自動指派,為目前系統時間,精确到毫秒。如果每個cell儲存同一份資料多個版本時,可通過時間戳來索引版本。
5.6 統計表中記錄總數
<code> </code><code>hbase(main):050:0> count </code><code>'tb1'</code>
<code> </code><code>2 row(s) </code><code>in</code> <code>0.0190 seconds</code>
<code> </code>
<code> </code><code>=> 2</code>
5.7 檢視表中某條記錄
<code> </code><code>hbase(main):054:0> get </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code>
<code> </code><code>column cell </code>
<code> </code><code>address: timestamp=1435129096397,value=beijing </code>
<code> </code><code>info:age timestamp=1435129054098,value=</code><code>man</code>
<code> </code><code>info:sex timestamp=1435128714392,value=22</code>
5.8 檢視表中某行某列族中的所有資料
<code> </code><code>hbase(main):055:0> get </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code><code>,</code><code>'info'</code>
<code> </code><code>column cell </code>
5.9 更新一條記錄(覆寫)
<code> </code><code>hbase(main):063:0> put </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code><code>,</code><code>'info:sex'</code><code>,</code><code>'23'</code>
<code> </code><code>0 row(s) </code><code>in</code> <code>0.0080 seconds</code>
6.0 給lisi增加一個comment字段
<code> </code><code>hbase(main):070:0> incr </code><code>'tb1'</code><code>,</code><code>'lisi'</code><code>,</code><code>'info:comment'</code>
6.1 删除某行某列族資料
<code> </code><code>hbase(main):065:0> delete </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code><code>,</code><code>'info:sex'</code>
6.2 删除某行所有記錄
<code> </code><code>hbase(main):067:0> deleteall </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code>
6.3 删除一個表
<code> </code><code>hbase(main):072:0> disable </code><code>'tb1'</code> <code>#先禁用</code>
<code> </code><code>hbase(main):073:0> drop </code><code>'tb1'</code> <code>#再删除</code>