所谓RowKey行键生成器,是指通过软件工具制定行键生成策略,并可将策略信息保存成本地策略文件,待需要时再将本地策略文件序列化成行键生成策略对象,传入数据行信息后可自动生成RowKey行键。

那么,为什么要设计这个行键生成器呢?最初的时候,我们有一个需求,要把Oracle中的若干大表数据导入到HBase中,那么这里就出现了一个问题:那么多表,每个表的RowKey生成规则都是不一样的,难道我们要为每个表都设计一个行键生成方法吗?!

当然不可能,我们必须做一些事半功倍或者一劳永逸的事情来解决这个问题,所以我们就想到可以设计一个行键生成器工具,这样开发人员就可以手动制订生成一些策略文件,并可把这些策略文件打成jar包文件进行分发。下图为其效果图。

 

下面笔者将详细介绍下设计思路。

第一,HBase中的行键信息,往往是由多个数据信息组合而成,而且大部分情况下都是基于已有的关系数据库表的列字段信息。举个例子,现在我们要把PUBLISH_DATA_INFO(发布数据信息表)中的数据信息导入到HBase表中,行键由“PUBLISH_TIME”和“DATA_TYPE”组成,那么,现在我们就首先确定了行键信息的数据来源。

第二,我们再重申下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"}]

第四,该怎么使用这些行键生成策略呢?在系统启动的时候,通过接口方法加载这些行键生成策略信息(文件),将其加载到内存中,然后组织与行键相关的字段信息集合,并将其传递到指定的接口方法中,最终生成行键。示例代码如下:

//加载行键策略本地文件
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

主页:http://www.cnblogs.com/shangbingbing

空间:http://shangbingbing.qzone.qq.com

HBase应用开发回顾与总结系列之三:RowKey行键生成器工具的更多相关文章

  1. HBase应用开发回顾与总结系列之一:概述HBase设计规范

      概述 笔者本人接触研究HBase也有半年之久了,虽说不上深入和系统,但至少算是比较沉迷.作为部门里大数据技术的探路者,笔者还要承担起技术传播的职责,所以在摸索研究的过程中总是不断地进行总结和测试, ...

  2. HBase应用开发回顾与总结系列之二:RowKey行键设计规范

    2. RowKey行键设计规范 2.1. RowKey四大特性 2.1.1 字符串类型 虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为Strin ...

  3. HBase应用开发回顾与总结系列之四:HBase配置管理类接口设计

      利用Eclipse进行HBase应用开发时,至少需要确定三个配置信息,如下表所示: #hbase config #HMaster服务部署主机及端口号 hbase.master=hdp-wuyong ...

  4. Hadoop HBase概念学习系列之优秀行键设计(十六)

    我们通过行键访问HBase.尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行. 优秀的行键设计可以保证良好的HBase性能. 1.行键存在于HBase中的每一个单元格 ...

  5. 架构师必备:HBase行键设计与应用

    首先要回答一个问题,为何要使用HBase? 随着业务不断发展.数据量不断增大,MySQL数据库存在这些问题: MySQL支持的数据量为TB级,不能一直保留历史数据.而HBase支持的数据量为PB级,适 ...

  6. Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程

    原文:Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列之三 SQL S ...

  7. 大数据学习系列之三 ----- HBase Java Api 图文详解

    版权声明: 作者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 个人博客出处:http ...

  8. DataSnap 2009 系列之三 (生命周期篇)

    DataSnap 2009 系列之三 (生命周期篇) DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置 当DSServer启动时从DSServerClass组 ...

  9. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

       手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                    ...

随机推荐

  1. Java final方法

    之所以要使用final方法,可能是出于对两方面理由的考虑.第一个是为方法"上锁",防止任何继承类改变它的本来含义.设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖 ...

  2. c# tabcontrol事件以及上下文菜单

    今天在搞中间件的客户端管理工具时,遇到需要管理tabcontrol子页的问题,希望在右击标签页是弹出关闭.关闭其他的提示框,如下所示: 可通过增加一个ContextMenuStrip,并在tabCon ...

  3. 常见.NET功能代码汇总

    1,在Web上修改指定文件位置的Web.config 这里需要使用 WebConfigurationManager 类,但必须使用WebConfigurationFileMap类来指定文件位置,看代码 ...

  4. [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案

    [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案 问题情景 在Android里,可以使用WebView来呈现本地或是远程的网页内容.但是在显示本地网页时,如 ...

  5. windows10 网络热点

    (1)快捷键 :win + x (2)判断自己的电脑是否支持无线接口,输入以下命令,会出现提示是否支持无线接口,如果不支持,请不要往下看了.. netsh wlan show drivers (3)若 ...

  6. 强大的<canvas>

    <canvas> 个人认为<canvas>是h5最重量级的新标签了,现在各种h5小游戏都是基于<canvas>的,它为游戏提供了一个功能强大的画布,可在画布上绘制丰 ...

  7. Dotfuscator混淆加密

    混淆加密 1. 需要安装Dotfuscator软件 2. 安装好后打开软件,找到编译好的DLL文件 3. 打开[setting]设置属性,如下图: 把 Disable String Encryptio ...

  8. 对URL编码

    url支持26个英文字母.数字和少数几个特殊字符,因此,对于url中包含非标准url的字符时,就需要对其进行编码.iOS中提供了函数stringByAddingPercentEscapesUsingE ...

  9. Android自定义控件2--优酷菜单界面初始化

    本文开始将逐步去实现下面优酷菜单的效果: 本文地址:http://www.cnblogs.com/wuyudong/p/5912538.html,转载请注明源地址. 本文首先来实现优酷菜单界面初始化工 ...

  10. Java你可能不知道的事系列1

    概述 本类文章会不段更新分析学习到的经典面试题目,在此记录下来便于自己理解.如果有不对的地方还请各位观众拍砖. 今天主要分享一下常用的字符串的几个题目,相信学习java的小伙伴们对String类是再熟 ...