1. 程式人生 > >HBase框架基礎(二)

HBase框架基礎(二)

alt 這一 tro sca staf 創建表 ips 2.0 大數

* HBase框架基礎(二)

上一節我們了解了HBase的架構原理和模塊組成,這一節我們先來聊一聊HBase的讀寫數據的過程。

* HBase的讀寫流程及3個機制

HBase的讀數據流程:

1、HRegionServer保存著meta表以及表數據,要訪問表數據,首先Client先去訪問zookeeper,從zookeeper裏面獲取meta表所在的位置信息,即找到這個meta表在哪個HRegionServer上保存著。

2、接著Client通過剛才獲取到的HRegionServer的IP來訪問Meta表所在的HRegionServer,從而讀取到Meta,進而獲取到Meta表中存放的元數據。

3、Client通過元數據中存儲的信息,訪問對應的HRegionServer,然後掃描所在HRegionServer的Memstore和Storefile來查詢數據。

4、最後HRegionServer把查詢到的數據響應給Client。

HBase寫數據流程:

1、Client也是先訪問zookeeper,找到Meta表,並獲取Meta表元數據。

2、確定當前將要寫入的數據所對應的HRegion和HRegionServer服務器。

3、Client向該HRegionServer服務器發起寫入數據請求,然後HRegionServer收到請求並響應。

4、CLient先把數據寫入到HLog,以防止數據丟失。

5、然後將數據寫入到Memstore

6、如果HLog和Memstore均寫入成功,則這條數據寫入成功

7、如果Memstore達到閾(yu)值(註意,不存在“閥值”這麽一說,屬於長期的誤用,在此提醒),會把Memstore中的數據flush到Storefile中。

8、當Storefile越來越多,會觸發Compact合並操作,把過多的Storefile合並成一個大的Storefile。

9、當Storefile越來越大,Region也會越來越大,達到閾值後,會觸發Split操作,將Region一分為二。

重申強調上述涉及到的3個機制:

** Flush機制:

當MemStore達到閾值,將Memstore中的數據Flush進Storefile

涉及屬性:

hbase.hregion.memstore.flush.size:134217728

即:128M就是Memstore的默認閾值

hbase.regionserver.global.memstore.upperLimit:0.4

即:這個參數的作用是當單個HRegion內所有的Memstore大小總和超過指定值時,flush該HRegion的所有memstore。RegionServer的flush是通過將請求添加一個隊列,模擬生產消費模式來異步處理的。那這裏就有一個問題,當隊列來不及消費,產生大量積壓請求時,可能會導致內存陡增,最壞的情況是觸發OOM。

hbase.regionserver.global.memstore.lowerLimit:0.38

即:當MemStore使用內存總量達到hbase.regionserver.global.memstore.upperLimit指定值時,將會有多個MemStores flush到文件中,MemStore flush 順序是按照大小降序執行的,直到刷新到MemStore使用內存略小於hbase.regionserver.global.memstore.lowerLimit。

** Compact機制:

把小的Memstore文件合並成大的Storefile文件。

** Split機制

當Region達到閾值,會把過大的Region一分為二。

技術分享圖片

* HBaseAPI的使用

接下來我們來嘗試一下使用Java來操作一下HBase,首先我們需要配置一下開發環境。

** 下載maven離線依賴包

maven本次用到的Hbase+Hadoop的Maven離線依賴包傳送門:

鏈接:http://pan.baidu.com/s/1bpthCcf 密碼:wjq

** 新建Eclipse的Maven Project,配置pom.xml的dependency如圖:

技術分享圖片

** 接下來我們來表演一下HBase的相關操作

首先,聲明靜態配置,用以初始化整個Hadoop以及HBase的配置,如圖:

技術分享圖片

檢查表是否存在:

技術分享圖片 由於我的HBase中有student表,所以執行後返回true

註:這就是一個最簡單的示例,接下來的代碼展示,只展示最核心的函數塊,不再全部截圖,文後結束給大家Demo源碼傳送門

創建數據庫表:

技術分享圖片

此處我在Java的主函數中執行了該創建表的方法,表明為staff,並有兩個列族,分別為info和other_info,成功後,來到CRT驗證一下,如圖:

技術分享圖片

刪除數據庫表:

完成後請自行測試,如何測試已經在上一步告訴你了

技術分享圖片

增:

向我們之前創建好的student表中插入一條數據

技術分享圖片

然後執行:

技術分享圖片 請自行觀察執行結果

結果:

技術分享圖片

刪:

技術分享圖片

改:

與增的案例意思是一樣的,只需要按照指定的rowKey和列族:列覆蓋原來的值就可以了

查:

查詢表中的所有數據和信息,所有的都會查了,單行信息就很簡單了~

技術分享圖片

測試結果:

技術分享圖片

源碼傳送門:

鏈接:http://pan.baidu.com/s/1o8x5q8i 密碼:2kf1

* HBase的MapReduce調用

1、首先需要查看配置HBase的Mapreduce所依賴的Jar包,使用命令:

$ bin/hbase mapredcp,然後出現如下依賴,這些依賴我們一會需要export 到classpath中:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-common-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/protobuf-java-2.5.0.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-client-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-hadoop-compat-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-protocol-0.98.6-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/high-scale-lib-1.1.1.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/zookeeper-3.4.5-cdh5.3.6.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/guava-12.0.1.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/htrace-core-2.04.jar:

/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/netty-3.6.6.Final.jar

2、執行環境變量的臨時導入

$ export HBASE_HOME=/opt/modules/hbase-0.98.6-hadoop2

$ export HADOOP_HOME=/opt/modules/cdh/hadoop-2.5.0-cdh5.3.6

$ export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`

註意:兩邊有反引號,表示將mapredcp命令的執行結果賦值給classpath。

3、運行官方自帶的MapReduce相關的jar

案例一:統計student表有多少行數據

直接執行代碼:

$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar lib/hbase-server-0.98.6-hadoop2.jar rowcounter student

案例二:使用MapReduce任務將數據導入到HBase

Step1、創建測試文件

$ vi fruit.txt,文件如圖:

技術分享圖片

完事之後,我們要上傳這個fruit.txt到HDFS系統中

$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put ./fruit.txt /input/

Step2、創建HBase表

$ bin/hbase shell

hbase(main):001:0> create ‘fruit‘,‘info‘

Step3、執行MapReduce到HBase的fruit表中

在這一步開始之前,我們先拓展一點知識:

* tsv格式的文件:字段之間以制表符\t分割

* csv格式的文件:字段之間以逗號,分割(後面的數據分析我們會經常涉及到這樣的格式)

$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar \

lib/hbase-server-0.98.6-hadoop2.jar importtsv \

-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color \

fruit hdfs://mycluster/input

成功之後,我們來檢查一下HBase中的數據,如圖:

技術分享圖片

驚不驚喜?意不意外?

* 總結

本節主要是了解一些HBase的一些基本Java API,以及如何使用官方的jar來執行一些常用的MapReduce操作,比如向HBase中導入數據。註意:一定要仔細觀察每一條語句執行的參數和意義,不要直接復制。(截圖展示代碼的目的也正是如此)


個人微博:http://weibo.com/seal13

QQ大數據技術交流群(廣告勿入):476966007



作者:Z盡際
鏈接:https://www.jianshu.com/p/fb59dabbd67a
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

HBase框架基礎(二)