天天看點

基于Hadoop分布式資料庫HBase1.0部署及使用

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>&lt;configuration&gt;</code>

<code>       </code><code>&lt;!--hbase資料目錄位置--&gt;</code>

<code>   </code><code>&lt;property&gt;</code>

<code>       </code><code>&lt;name&gt;hbase.rootdir&lt;</code><code>/name</code><code>&gt;</code>

<code>       </code><code>&lt;value&gt;hdfs:</code><code>//hcluster/hbase</code><code>&lt;</code><code>/value</code><code>&gt;</code>

<code>   </code><code>&lt;</code><code>/property</code><code>&gt;</code>

<code>       </code><code>&lt;!--啟用分布式叢集--&gt;</code>

<code>       </code><code>&lt;name&gt;hbase.cluster.distributed&lt;</code><code>/name</code><code>&gt;</code>

<code>       </code><code>&lt;value&gt;</code><code>true</code><code>&lt;</code><code>/value</code><code>&gt;</code>

<code>       </code><code>&lt;!--預設hmaster http通路端口--&gt;</code>

<code>       </code><code>&lt;name&gt;hbase.master.info.port&lt;</code><code>/name</code><code>&gt;</code>

<code>       </code><code>&lt;value&gt;16010&lt;</code><code>/value</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/property</code><code>&gt;</code>

<code>       </code><code>&lt;!--預設hregionserver http通路端口--&gt;</code>

<code>    </code><code>&lt;property&gt;</code>

<code>       </code><code>&lt;name&gt;hbase.regionserver.info.port&lt;</code><code>/name</code><code>&gt;</code>

<code>       </code><code>&lt;value&gt;16030&lt;</code><code>/value</code><code>&gt;</code>

<code>       </code><code>&lt;!--不使用預設内置的,配置獨立的zk叢集位址--&gt;</code>

<code>       </code><code>&lt;name&gt;hbase.zookeeper.quorum&lt;</code><code>/name</code><code>&gt;</code>

<code>       </code><code>&lt;value&gt;hslave0,hslave1,hslave2&lt;</code><code>/value</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>/configuration</code><code>&gt;</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頁面檢視:

基于Hadoop分布式資料庫HBase1.0部署及使用

  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&gt; 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&gt; describe </code><code>'tb1'</code>

  5.3 列出所有表

<code>  </code><code>hbase(main):025:0&gt; list</code>

  5.4 插入幾條記錄

<code>  </code><code>hbase(main):028:0&gt; 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&gt; 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&gt; 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&gt; 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&gt; 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&gt; 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&gt; 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&gt; 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>=&gt; 2</code>

  5.7 檢視表中某條記錄

<code>  </code><code>hbase(main):054:0&gt; 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&gt; 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&gt; 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&gt; 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&gt; 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&gt; deleteall </code><code>'tb1'</code><code>,</code><code>'zhangsan'</code>

  6.3 删除一個表

<code>  </code><code>hbase(main):072:0&gt; disable </code><code>'tb1'</code>  <code>#先禁用</code>

<code>  </code><code>hbase(main):073:0&gt; drop </code><code>'tb1'</code>   <code>#再删除</code>

繼續閱讀