所谓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. easyui datagrid 点击表头的事件

    在用datagrid的时候我们可能要用到点击表头来触发一个function,这里有个简单的例子. 首先你得有个能用的datagrid. <div>    <table id=&quo ...

  2. linux kernel: possible SYN flooding on port 8080. Sending cookie

    possible SYN flooding on port 7244. Sending cookie

  3. 多平台下Modbus通信协议库的设计(一)

    1.背景 1.1.范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信. 自从 1979 年出现工业串行链路的事实标准以 ...

  4. The template engine

    Play has an efficient templating system which allows to dynamically generate HTML, XML, JSON or any ...

  5. go语言 rune切片

    go语言 rune切片 示例 package main import ( "fmt" ) //http://www.cnblogs.com/osfipin/ func main() ...

  6. mysql win源码比较大 不需要的文件删除 记录下来

    mysql-5.6.25-win32.zip 从官方下载下来的大小为 343MB,太大了可以删除掉的地方记录一下 docs :全部删除. sql-bench:全部删除. mysql-test :全部删 ...

  7. [整理]详记被忽略的Get与Post

    [事发]使用了近5年的项目,来了一个最最基本的bug画面输入+号,跳转至后画面,+号变成了空格![原因]画面使用url(get)方法传参数,并且没有进行url转码!恐怖的是,几乎所有页面都是如此... ...

  8. angular源码分析:angular中jqLite的实现——你可以丢掉jQuery了

    一.从function JQLite(element)函数开始. function JQLite(element) { if (element instanceof JQLite) { //情况1 r ...

  9. linux下发布的执行文件崩溃的问题定位 心得一则

    C++ Release版本发布到客户处执行时,如果程序崩溃,有什么办法能够快速的确认程序的问题呢? 如果能gdb调试的话,比较简单了,可以使用gdb命令,类似如下: gdb ##set args ** ...

  10. Quartz2D复习(三) --- 涂鸦

    和上一篇手势解锁不一样,手势解锁只画了一条路径,从触摸开始-->触摸移动-->触摸结束 ,然后路径完成了,渲染出来就是手势解锁了: 这次涂鸦想做到的效果是可以画很多次线段或弧,每次又可以设 ...