所谓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