一种电力量测类数据迁移到HBase的方法

2018-07-16 12:04苏鹏涛
电子技术与软件工程 2018年10期
关键词:日志数据库模块

文/苏鹏涛

1 引言

随着电力信息化的建设推进,电力企业数据中心积累了大量的数据资源,数据准确性越来越高,量测类数据其所占比重也越来越大,已具备良好的数据基础。通过各种基于大数据平台的数据挖掘工具或查询引擎,可以实现快速查询、负荷预测、异常分析等高级应用,提高企业运营水平、发掘数据潜在价值。由于生产系统大都为传统关系型数据库,这就需要将海量的量测数据从传统关系型数据库迁移到大数据平台,虽然Sqoop等工具支持将关系型数据库导入HBase中,但其需要与其它调度工具如Oozie配合使用才可实现定时任务,并且没有自动补传功能。本方法基于HBaseJava API 实现了一种支持自动补传的传统关系型数据库迁移到HBase的方法。

该方法通过JDBC访问数据源,通过HBaseJava API操作HBase数据库写入数据,可以实现电力量测类数据从传统关系型数据库向大数据平台HBase数据库的自动迁移,支持增量延时同步功能,能够做到迁移失败数据的自动补传,具有稳定内存消耗、降低集群资源需求、灵活控制迁移方式、快速增加迁移任务、缺失数据自动补传、异常提醒和任务定时启动等优点。

2 一种电力量测类数据迁移到HBase的方法

2.1 HBase表结构

HBase是建立在Hadoop文件系统上的分布式列式数据库,它是一种NoSQL数据库,主要适用于海量明细数据(十亿、百亿级)的随机实时查询,如日志明细、交易清单、轨迹行为等,非常适合于电力量测类海量数据的快速查询、综合分析等应用。

电力量测类数据是一种具有明显时序特性的数据,主要由采集日期、采集点(从0点整开始,根据采集设备不同,每隔2、5或15分钟一个)、设备号、量测类型、采集值(量测值)构成,其中设备号可关联到设备信息。量测快速查询主要有两种类型的需求,一是查询某一设备一段时间的曲线(如查询XX变压器连续一个月的负荷典线,了解哪些时段负荷高等),二是查询某一时间各设备的数值(如查询XX区所有变压器负荷,哪些设备超载等)。为满足这两种快速查询需求,设计HBase表结构如图1所示,以公司简码、时间、主设备号、量测类型合并作为Rowkey,以设备号作为列名,示数值作为值,公司简码作为分区。

图1:HBase表结构

图2:量测类数据宽表

图3:功能结构图

2.2 迁移方法功能模块

Sqoop是一款开源的工具,主要用于在Hadoop与传统的数据库间进行数据的相互迁移。它以Shell命令的方式进行调用,可以将命令中的查询语句的结果导入到HBase中。

量测类数据多表关联后的数据宽表如图2所示。每个设备每天一条数据,96个列记录96个测点值,与图1HBase表结构相比有两个结构上的差异。一是需要将一行数据中的n个时间点转换为n行;二是需要将每个主设备号下的n行的每个设备号转换为一行的n个列,并且以设备号作为列名。这就同时涉及到行转列和列转行,由于Sqoop依赖于SQL语句查询结果,要通过一个SQL语句实现此结构转换非常困难,语句极其复杂。本迁移方法使用Java语言开发,通过SQL查询出宽表数据,再对每一条宽表数据按照配置的规则拆分组装,这样两个循环结构即可实现此结构转换。其功能结构如图3所示。

本方法能根据主机硬件信息、HBase集群信息设定最佳的写入方式,由查询模块、配置模块、日志模块、转换模块、写入模块、管理模块六个功能模块组成。

查询模块通过JDBC从关系型数据库查询数据;

配置模块用于配置连接、表、查询条件、结果输出格式、写入方式等;

日志模块记录每张表每次迁移的状态;

转换模块按照对应HBase结构将查询模块查到的结果数据转换为写入模块需要的格式;

写入模块按照配置模块写入参数通过API将数据写入HBase中;

管理模块定时启动迁移任务并根据日志模块记录的日志信息补传未成功迁移的数据。

所有模块均由Java语言开发,数据存储于MySQL数据库,使用JDBC方式分批访问量测数据,使用JavaHBase API访问HBase。

2.3 迁移流程

迁移流程如图4所示。

开始:每日由管理模块定时启动迁移任务。

步骤1:管理模块检索日志模块记录的迁移日志,判断历史迁移日期中是否存在异常状态记录或有日志缺失。若有执行步骤2,若无执行步骤3。

步骤2:管理模块生成缺失、异常日志信息列表。执行步骤4。

步骤3:查询模块读取配置模块参数,按参数分批查询需迁移的数据表前一日数据。执行步骤5。

步骤4:查询模块读取配置模块参数,按参数分批查询需迁移的数据表对应的生成缺失、异常日志信息列表中的最早日期数据,并从列表中删除此条记录。执行步骤5。

步骤5:转换模块按配置模块参数将步骤3或步骤4查询结果转换为HBase需要的结构。执行步骤6。

步骤6:写入模块通过API,按照配置模块参数多线程并行写入HBase。执行步骤7。

步骤7:日志模块记录或更新日志。执行步骤8。

步骤8:管理模块判断日志记录中是否已有前一日日志,若有执行步骤11,若无执行步骤9。

步骤9:查询模块检查生成缺失、异常日志信息列表,若已无信息执行步骤10,若有信息执行步骤4。

步骤10:查询模块读取配置模块参数按参数分批查询需迁移的数据表前一日数据。执行步骤5。

步骤11:管理模块结束当次迁移任务,并检查日志记录中是否存在异常次数大于等于2的日志记录。若有发出警告日志,提醒人工检查。

整个迁移过程中,若日志模块、管理模块发生异常,会造成日志缺失;其它模块发生异常会记录异常日志到日志模块中。后一日迁移任务均可根据日志记录自动补传。当发生补传无效情况时,管理模块生成告警日志,提醒人工干预检测处理,以此机制确保迁移的自动化和可靠性。

2.4 迁移效果

测试环境为CDH大数据平台,其HBase集群由7台配置相同的服务器构成,每台服务器均安装了一个独立的Sqoop组件。由于量测数据量较大,Sqoop使用的转换SQL较复杂,采用一个Sqoop命令迁移全部数据时较容易发生卡死,因此将其拆分为多个命令。7台服务器,每台启动一个Sqoop迁移,每个Sqoop特意改造为迁移不同HBase分区的数据,以确保数据均衡,达到最大效率。Sqoop伪代码如下:

其中--query "......"部分需要将整个逻辑写为一个可执行的SQL语句。

迁移方法配置为分批查询,每批次查询固定量的数据,在内存中转换写入后再抽取下一批数据,以确保使用较低的内存达到较高的效率。管理模块根据HBase集群数,每台HBase主机单独启动一个迁移进程,每个进程迁移不同分区数据,确保所有HBase节点均合理利用起来。

通过测试,转换写入1亿行原始数据,写入HBase后数据大小约900G。若用Sqoop用时4小时38分,平均速率约每秒56M,单个进程每秒8M。使用本迁移方法用时5小时01分,平均速率约每秒51M,单个进程每秒7.3M。服务器资源消耗两者相当,迁移方法由于有日志等其它开销,效率稍低于Sqoop。

虽然数据迁移效率略低于Sqoop,但若需补传少量数据时,Sqoop会将全部数据重传,所有已传数据变为历史版本,极大增加了系统存储负担。若Sqoop要达到本方法的补传效果,需要人为查询HBase中表数据情况,再更改Sqoop中的SQL语句,当HBase表中数据量极大时,很难查到失败数据的断面信息,操作可行性极低。

本方法在数据迁移过程中,通过直接Kill进程方式强制结束数据迁移。迁移方法进程在被Kill之前已完成迁移的数据其日期已被记录于日志中,Kill后进程停止,其后日志缺失。重启迁移任务,管理模块根据日志自动将缺失日志的日期的数据补传,仅补传Kill执行后的缺失数据,覆盖前次数据使其成为历史版本。

3 结论

图4:迁移流程图

本文研究了一种电力量测类数据迁移到HBase的方法,包含查询模块、配置模块、日志模块、转换模块、写入模块、管理模块等六个功能模块,通过配置查询语句、转换数据结构和设定系统参数,基于JDBC访问电力量测类数据传统关系型数据库、HBase Java API操作HBase数据库,实现写入迁移数据、记录迁移日志、定时启动任务和自动补传数据功能。本方法可以实现电力量测类数据从传统关系型数据库到HBase数据库的自动迁移,支持增量延时同步功能,能够做到迁移失败数据的自动补传,能够以较高效率将电力量测类数据导入HBase,并解决了缺失数据自动补传的问题,降低了电力量测类数据迁移到HBase的执行难度,提高了数据迁移的灵活性、便利性和稳定性。

猜你喜欢
日志数据库模块
28通道收发处理模块设计
“选修3—3”模块的复习备考
一名老党员的工作日志
扶贫日志
游学日志
一种基于粗集和SVM的Web日志挖掘模型
集成水空中冷器的进气模块