該文前提為已經搭建好的HBase集群環境,參見 HBase集群搭建與配置 ,本文主要是用Java編寫一個Servlet接口,部署在Tomcat服務器上,用於提供http的接口供其他地方調用,接口中集成了一些簡易HBase操作,有需要可以再繼續擴展。
軟件環境:
IntelliJ IDEA、Hadoop-2.9.2、HBase-1.4.9
Jar包引入
程序所需jar包,基本在HBase的lib目錄下都能找到,該文因暫時沒使用MapReduce,因此只需如下jar包
在File->Project Structure->Libraries中添加如下jar包
並在Modules中選中站點根目錄,Dependencies頁簽,將lib加入項目
我直接繼承的HttpServlet,重構了doGet與doPost函數,也可以直接繼承Servlet自己來實現細節,Servlet創建方法請參照網上其他教程,這里自己封裝了JsonResult,接口返回均使用json格式,實現了4種接口,具體如下
基礎設施
這里創建了幾個基礎文件:hdfs.properties、HBaseProperties、HBaseHelper具體信息如下
hdfs.properties配置文件用於配置HBase的連接參數
HBaseProperties類用於封裝的獲取配置文件的代理,獲取配置信息,並返回map值
HBaseHelper封裝的是HBase具體的操作,其中configuration是配置信息,從配置文件獲取后寫入,然后創建connection連接
還有一點需要注意的是想運行並連接上集群,需要在部署Tomcat的服務器上配置環境變量HADOOP_HOME,指向hadoop的根目錄,並將winutils.exe等相關文件拷貝到hadoop中bin目錄下,具體文件如下
以上文件可以參考github中的開源代碼自己生成所需版本 https://github.com/steveloughran/winutils
HBase創建表
這里參數tbName為要創建的表名,familylist為列簇的字符串數組
過程為判斷表是否存在,不存在則遍歷familylist,獲取列簇名稱添加到表描述中,最后創建改表
插入數據
插入數據一共寫了3個
1.插入某行,某列簇,某列的數據,可以用於修改或者特殊插入,代碼如下
參數分別是tbName表名、rowkey行名、family列簇名、col列名、value具體的值
2.插入一行數據,代碼如下
其中familymap是一個hashmap,key為列簇,value是一個鍵值對的map,這個map為該列簇下列名與數據的鍵值對
其中函數BuildPut構建put函數封裝如下
3.插入多行數據,也是使用最多的函數
其中rows是hashmap類型,key為rowkey,value為函數2中的familymap,遍歷所有rowkey,通過BuildPut構建出來,加入table中,需要注意的是rowkey的設計,需要注意防止數據傾斜。業務上這里因為有大量設備周期性發送數據,因此我用的設備編號hash后,取前8位加上時間戳來作為rowkey
通過rowkey查詢指定列
這里傳入參數tbName為表名,rowkeys為rowkey的字符串數組,通過遍歷rowkeys,生成Get並加入table查詢,最后查詢結果Result通過構建函數BuildSourceMap構建為之前那種map格式,最后通過json轉換返回給調用接口
其中BuildSourceMap構建函數如下
將獲取到的數據遍歷,然后逐步加入列的map、列簇的map、最終的map並返回
通過Scan模糊匹配查詢
一共封裝了2種模糊匹配,一種是帶了列簇名稱,一種是未帶,沒有帶列簇的將會遍歷所有列簇,並加入過濾條件中
1.帶了列簇信息,其中list過濾條件中格式規定如下
string="{0},{1},{2},{3}"
其中0為列簇名稱,1為列名稱,2為匹配操作符,3為匹配的值
查詢到的結果通過函數BuildSourceMap構建為map返回,操作符匹配CompareOp的函數如下
2.不帶列簇信息,其中list過濾條件中格式規定如下
string="{0},{1},{2}"
其中0為列名稱,1為匹配操作符,2為匹配的值
至此HBase的一些常用操作就封裝完畢了,只需要打包發布部署上就可以使用了,后續還會寫一篇C#封裝的用於提供C#后端調用,而底層對接該接口的類庫,這樣就可以串起來用了