所謂RowKey行鍵生成器,是指經過軟件工具制定行鍵生成策略,並可將策略信息保存成本地策略文件,待須要時再將本地策略文件序列化成行鍵生成策略對象,傳入數據行信息後可自動生成RowKey行鍵。java
那麼,爲何要設計這個行鍵生成器呢?最初的時候,咱們有一個需求,要把Oracle中的若干大表數據導入到HBase中,那麼這裏就出現了一個問題:那麼多表,每一個表的RowKey生成規則都是不同的,難道咱們要爲每一個表都設計一個行鍵生成方法嗎?!正則表達式
固然不可能,咱們必須作一些事半功倍或者一勞永逸的事情來解決這個問題,因此咱們就想到能夠設計一個行鍵生成器工具,這樣開發人員就能夠手動制訂生成一些策略文件,並可把這些策略文件打成jar包文件進行分發。下圖爲其效果圖。sql
下面筆者將詳細介紹下設計思路。數據庫
第一,HBase中的行鍵信息,每每是由多個數據信息組合而成,並且大部分狀況下都是基於已有的關係數據庫表的列字段信息。舉個例子,如今咱們要把PUBLISH_DATA_INFO(發佈數據信息表)中的數據信息導入到HBase表中,行鍵由「PUBLISH_TIME」和「DATA_TYPE」組成,那麼,如今咱們就首先肯定了行鍵信息的數據來源。json
第二,咱們再重申下HBase行鍵的幾個生成原則:定長、惟一性等。那麼,咱們就必須對組成行鍵的數據進行格式化處理,常規的格式化處理方式有如下幾種:去除空格、替換特殊字符、前補齊、後補齊、字符顛倒等等,所用的java技術也不外乎那幾個方法:trim、replace、substring等等。固然,對於某些特殊狀況,你也能夠採用正則表達式進行處理。筆者將這些格式化處理統稱爲配置策略。網絡
第三,HBase行鍵生成策略信息制定後,須要將其持久化保存,以便其餘人員和系統使用。保存方式有多種,譬如,將其保存到Oracle或者Mysql數據庫表中,能夠確保惟一性,並且能夠經過網絡供多個用戶和系統共用,是最佳的保存方式。也能夠將其序列化成本地文件(xml或者json文件等),筆者如今設計的這個版本,就是將行鍵生成策略信息序列化成json文件保存到本地。以下表所示:工具
[{"DATA_TYPE":"DATA_TYPE","PUBLISH_TIME":"PUBLISH_TIME"},{"columnName":"PUBLISH_TIME","length":14,"numberStep":1,"prefixChar":"","prefixNumber":0,"replaceChar":"","replaceSourceChar":"- :","splitChar":".","startNumber":1,"suffixChar":"0","suffixNumber":0,"value":"2015-12-26 12:24:00"},{"columnName":"DATA_TYPE","length":4,"numberStep":1,"prefixChar":"","prefixNumber":0,"replaceChar":"","replaceSourceChar":"","splitChar":"","startNumber":1,"suffixChar":"0","suffixNumber":0,"value":"D1"}]
第四,該怎麼使用這些行鍵生成策略呢?在系統啓動的時候,經過接口方法加載這些行鍵生成策略信息(文件),將其加載到內存中,而後組織與行鍵相關的字段信息集合,並將其傳遞到指定的接口方法中,最終生成行鍵。示例代碼以下:oop
//加載行鍵策略本地文件 String policyFilePath = "D:\\PMS_EQUIP_INFO.policy"; RowKeyPolicy rowKeyPolicy = RowKeyPolicy.openRowKeyGeneratorPolicyFile(policyFilePath); //構建測試用的數據行 Map<String,Object> row = new HashMap<String,Object>(); row.put("PUBLISH_TIME", "2015-08-12 16:35:00"); row.put("DATA_TYPE", "D01"); String rowKey = rowKeyPolicy.getRowKey(row, false); LogInfoUtil.printLog("RowKey=" + rowKey); row.put("PUBLISH_TIME", "2015-09-12 16:35:00"); row.put("DATA_TYPE", "D02"); rowKey = rowKeyPolicy.getRowKey(row, false); LogInfoUtil.printLog("RowKey=" + rowKey); //打印日誌信息以下 **********RowKey=20150812163500.D010 **********RowKey=20150912163500.D020
第五,下面是筆者開發時的工程文件,代碼尚未來得及優化,有興趣的朋友,能夠下載下來看看。附工程結構圖:測試
附件:優化
hnepri-hadoop-hbase-rowkey工程代碼
做者:商兵兵
單位:河南省電力科學研究院智能電網所
QQ:52190634