HBase框架基礎(二)

* 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中導入數據。注意:一定要仔細觀察每一條語句執行的參數和意義,不要直接復制。(截圖展示代碼的目的也正是如此)


IT全棧公眾號:

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


下一節:HBase框架基礎(三)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容