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中導入數據。註意:一定要仔細觀察每一條語句執行的參數和意義,不要直接復制。(截圖展示代碼的目的也正是如此)
個人微博:http://weibo.com/seal13
QQ大數據技術交流群(廣告勿入):476966007
作者:Z盡際
鏈接:https://www.jianshu.com/p/fb59dabbd67a
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
HBase框架基礎(二)