随着大数据技术的发展,很多互联网都在开发自己的大数据平台[DT],任何完整的大数据平台都包括数据采集、数据存储、数据处理、数据可视化这几个过程,数据采集可以说是大数据平台的基础,一切后续数据操作的前提,有着举足轻重的地位。
数据采集的方案有很多,针对结构化的离线的数据可以使用canal 基于binlog的数据采集,针对非结构化的实时的数据可以使用埋点加flume来进行采集。今天给大家介绍的是基于阿里开源的dataX的离线数据全量采集方案。
一、需求
将业务应用的数据源采集到greenplum数据仓库中,支持目前主流的结构化数据库mysql、oracle、sqlServer。
可以通过简单的页面操作完成对整库的数据采集。可以从下图看到,只需要配置数据源类型、ip、port以及数据库的账号密码就可以完成采集。
可以通过配置来完成对整库的增量采集和全量采集。

从采集的前端页面可以看到,操作可以称的上非常简便了。但是后端在进行开发时,尤其是对于这种针对整个数据库的采集,无疑增加了很多工作量,也带来了一些问题。
二、问题
目标库存储结构的设计
不同数据库的结构不同,如何对不同数据库做标识,如何对相同类型的数据库中不同的database做标识。

上图很清晰的描述了三个主流数据库的存储结构,而采集的目标库是GP数仓,GP数仓可以看作分布式的postgresql数据库,GP数仓的每个Segment其实就是一个postgresql数据库,而postgresql数据库的存储结构与sqlServer相同。

在面对不同数据库类型在数据库上的存储问题,采用了简单直接的方式。每个类型的 数据库采集到GP都是以database的形式存储,通过拼接源数据库的类型、ip、port的方式为GP中新建的database命名,以拼接源数据库中的databaseName和tableName来为GP中生成的新的表命名。上图是采集到GP数仓后的存储结构。
2. 任务失败的回滚策略
任务失败回滚的问题,因为是针对整个数据库的采集,只要某个表或者某个字段采集出现问题就能导致整个采集任务失败。所以对于整个数据库的采集,其任务的失败率会很高,采用什么样的回滚机制就非常重要。
目前在全量采集的功能模块,采用的是失败之前的所有操作全部回滚。这样可以有效的避免采集时重复数据,但是这样的回滚方式也是比较粗糙的。在进行大表采集时如果出现错误导致全部回滚,会消耗很多时间。
在此只讨论数据的全量采集,增量采集的问题暂不列举。
三、数据采集的结构与流程

组件介绍
1. Schemaspy
schemaSpy是一个获取数据库元数据的一个开源工具,我们在schemaSpy源码的基础上对它进行了改造,删除了不需要的模块使schemaSpy更加简洁。同样在元数据管理模块也应用到了schmaSpy。
2. dataX
dataX在之前的文章中已经介绍过了,之所以选用datax来实现数据的采集,是因为dataX支持目前绝大多数结构化数据源[mysql、oracle、sqlServer、postgresql…..],非结构化数据[TextFile、FTP、HDFS、ES…],NoSQL数据库[OTS、Hbase、MongoDB…],以及阿里云的数据仓库的采集,并且dataX可以基于插件的模式进行二次开发方便后续功能的扩展。
3. python脚本
python脚本的使用,在我们项目中我们会将源数据库中的建表语句抽取成一个sql文件然后通过python脚本处理将其转化成postgresql对应的建表语句,python在做这方面处理上有天然的优势
4. 注意
在使用python脚本进行转换时,一定要注意代码中的编解码格式,以及服务器中python解释器的编解码格式,如果两者的编解码格式不同在转换源表的中文注释时会造成乱码的问题。在使用java原生API调用python脚本、或linux上的工具时可能会出现进程死锁的问题。
采集流程

我们会通过SchemaSpy来获取源数据库的元数据,在GP中生成对应的库。然后通过python脚本来进行sql语法和数据类型的转换,并且在GP对应库中生成表。最后如果以上执行成功,则dataX开启采集任务,dataX在写入postgresql时,采用的是Copy的方式进行采集。
四、总结
目前虽然说整个数据全量采集的功能已经实现,但是还存在着一些缺陷,比如阿里开源的dataX采集工具只是单机版的数据采集,相对需要的系统的资源较大。在进行全库采集时的效率还是比较慢,且失败率高的问题。后面我们将着重于提高采集效率和完善任务失败的处理机制。
本文介绍了使用DataX进行离线结构化数据全量采集到Greenplum的过程,包括需求、遇到的问题(如数据库结构差异、回滚策略)、采集结构与流程,以及对数据转换和存储的详细说明。文章最后讨论了当前方案的不足和未来改进方向。

943

被折叠的 条评论
为什么被折叠?



