大數據中HBase的Java接口封裝

該文前提爲已經搭建好的HBase集羣環境,參見 HBase集羣搭建與配置 ,本文主要是用Java編寫一個Servlet接口,部署在Tomcat服務器上,用於提供http的接口供其餘地方調用,接口中集成了一些簡易HBase操做,有須要能夠再繼續擴展。html

軟件環境:git

IntelliJ IDEA、Hadoop-2.9.二、HBase-1.4.9github

Jar包引入

程序所需jar包,基本在HBase的lib目錄下都能找到,該文因暫時沒使用MapReduce,所以只需以下jar包json

在File->Project Structure->Libraries中添加以下jar包後端

image

並在Modules中選中站點根目錄,Dependencies頁籤,將lib加入項目數組

image

我直接繼承的HttpServlet,重構了doGet與doPost函數,也能夠直接繼承Servlet本身來實現細節,Servlet建立方法請參照網上其餘教程,這裏本身封裝了JsonResult,接口返回均使用json格式,實現了4種接口,具體以下服務器

基礎設施

這裏建立了幾個基礎文件:hdfs.properties、HBaseProperties、HBaseHelper具體信息以下函數

hdfs.properties配置文件用於配置HBase的鏈接參數oop

image

HBaseProperties類用於封裝的獲取配置文件的代理,獲取配置信息,並返回map值ui

image

HBaseHelper封裝的是HBase具體的操做,其中configuration是配置信息,從配置文件獲取後寫入,而後建立connection鏈接

image

還有一點須要注意的是想運行並鏈接上集羣,須要在部署Tomcat的服務器上配置環境變量HADOOP_HOME,指向hadoop的根目錄,並將winutils.exe等相關文件拷貝到hadoop中bin目錄下,具體文件以下

image

以上文件能夠參考github中的開源代碼本身生成所需版本 https://github.com/steveloughran/winutils

HBase建立表

這裏參數tbName爲要建立的表名,familylist爲列簇的字符串數組

過程爲判斷表是否存在,不存在則遍歷familylist,獲取列簇名稱添加到表描述中,最後建立改表

image

插入數據

插入數據一共寫了3個

1.插入某行,某列簇,某列的數據,能夠用於修改或者特殊插入,代碼以下

參數分別是tbName表名、rowkey行名、family列簇名、col列名、value具體的值

image

2.插入一行數據,代碼以下

其中familymap是一個hashmap,key爲列簇,value是一個鍵值對的map,這個map爲該列簇下列名與數據的鍵值對

image

其中函數BuildPut構建put函數封裝以下

image

3.插入多行數據,也是使用最多的函數

其中rows是hashmap類型,key爲rowkey,value爲函數2中的familymap,遍歷全部rowkey,經過BuildPut構建出來,加入table中,須要注意的是rowkey的設計,須要注意防止數據傾斜。業務上這裏由於有大量設備週期性發送數據,所以我用的設備編號hash後,取前8位加上時間戳來做爲rowkey

image

經過rowkey查詢指定列

這裏傳入參數tbName爲表名,rowkeys爲rowkey的字符串數組,經過遍歷rowkeys,生成Get並加入table查詢,最後查詢結果Result經過構建函數BuildSourceMap構建爲以前那種map格式,最後經過json轉換返回給調用接口

image

其中BuildSourceMap構建函數以下

將獲取到的數據遍歷,而後逐步加入列的map、列簇的map、最終的map並返回

image

經過Scan模糊匹配查詢

一共封裝了2種模糊匹配,一種是帶了列簇名稱,一種是未帶,沒有帶列簇的將會遍歷全部列簇,並加入過濾條件中

1.帶了列簇信息,其中list過濾條件中格式規定以下

string="{0},{1},{2},{3}"

其中0爲列簇名稱,1爲列名稱,2爲匹配操做符,3爲匹配的值

image

查詢到的結果經過函數BuildSourceMap構建爲map返回,操做符匹配CompareOp的函數以下

image

2.不帶列簇信息,其中list過濾條件中格式規定以下

string="{0},{1},{2}"

其中0爲列名稱,1爲匹配操做符,2爲匹配的值

image

至此HBase的一些經常使用操做就封裝完畢了,只須要打包發佈部署上就能夠使用了,後續還會寫一篇C#封裝的用於提供C#後端調用,而底層對接該接口的類庫,這樣就能夠串起來用了

相關文章
相關標籤/搜索