一种基于模块可编程扩展的ETL工具构建方法
技术领域
本发明涉及数据处理领域,尤其涉及基于模块可编程扩展的高效数据处理下的ETL工具构建方法。
背景技术
随着物联网、云计算、大数据技术的普及应用,生产中积累了大量数据,包括结构化的文本、数据库、实时流等,半结构化的邮件、报表、网页等,非结构化的图像、视音频等。实现精准的数据管理、快速的数据服务和智能化的决策,需要通过使用ETL(抽取、转换、加载)工具将来源不同、格式各异和特点相近的数据在逻辑上或物理上有机地集中在一起,达到数据格式标准化、访问一致化、存储集中化。
大数据市场的蓬勃发展推动了国内外软硬件技术的进步,出现了Oracle DataIntegrator(ODI)、Informatica、Oracle Goldengate、DataPipline、RestCloud、Kettle和DataX等数据集成和管理工具。这些工具有数据容灾备份、导入导出、同步处理等功能,但在处理灵活需求、复杂变化的转换逻辑、实时数据等基本功能方面依旧有难度,而且存在实现过程复杂、数据转化率低、无法集群管理、不支持断点续传、需要大量人工分析等问题。因此,需要研发新的ETL工具。
发明内容
针对上述问题,本发明提供一种高效数据处理下模块可编程扩展的新ETL工具构建方法。针对数据工程中,数据处理遇到的大量频繁查询、复杂交叉转换、分布式实时处理等问题,根据解决问题的不同分为面向查询服务的、面向多维数据的和面向大数据的三种,面向查询服务的重点关注构件组装、源表解析、查询配置、结果输出等功能,面向多维数据的重点关注抽取、转换、质量、装载、配置等规则设计,面向大数据重点关注分布式部署、实时数据处理和存储。
本发明提供如下技术方案:一种基于模块可编程扩展的ETL工具构建方法,包括以下步骤:
S1、对ETL工具模块化分割,每个构件包括类、函数和变量,是独立的和可组装、替换、配置、编程和执行的程序模块,对内构件参数覆盖功能,对外提供一组规范化接口;
S2、在数据查询服务中,在pycharm中新建项目或模块,根据源数据库的类型从构件库中选择合适的输入数据引擎读取构件、写入构件、报表生成构件,接入源数据所在数据库,将查询结果存到txt、excel报表或者数据仓库中;
S3、对于多维数据交叉转换,将多表头的Excel表格数据抽取到关系数据库,实现数据和多个维度组合唯一对应的关系;
S4、对于大数据时,通过B/S架构web管理系统,对ETL分布式集群进行管理,共同配置部分由ZooKeeper统一管理,通过消息中间件Kafka集群实现消息的转发。
步骤S1中,根据多维度关系表格或者关系数据库表,对ETL工具解构,包括数据源的管理、数据引擎、读取写入、公共维度、数据维度、源表解析、目标表解析、更新删除、读取配置、ETL主执行模块、异常处理、日志管理、运行监控,各模块采用逻辑和参数配置分离设计模式,以配置文件形式实现定位和具体功能,并将变量封装在轻量级json格式的数据文件中。
数据源包括关系数据库、半结构化数据包括xlxs、csv格式文件、非结构化数据包括doc、txt格式文件和外部API,并使用完整的数据字典形式详细记录的各类数据源,如数据库的名称、类型、访问方式、主机名称;数据操作引擎模块包括JDBC、HTTP访问数据源的方法;读取写入模块负责数据的读写;源数据从维度和数据层面进行分析,其中维度又分为公共、私有维度,源表、目标表解析模块是依据具体的表结构设计的解析和存储代码实现方法,更新、删除模块从另一条线路负责数据工程中单独表的特殊操作,ETL管理包括异常处理、日志管理、运行监控模块。
步骤S2中,在数据查询服务中,针对集成工具在数据工程中应具有批量数据查询和导出合适格式的数据的功能,设计了一种面向查询服务的ETL工具构建方法,快速数据处理,构建步骤包括:S21,在pycharm中新建项目或模块,根据源数据库的类型从构件库中选择需要的输入数据引擎读取构件、写入构件、报表生成构件,接入源数据所在数据库;S22,配置源表解析模块,包括多条sql查询语句文档和逻辑代码执行程序,或者根据需求编写新的业务处理逻辑;S23,根据目标数据格式配置输出数据引擎模块,将查询结果存到txt、excel报表或者数据仓库中;S24,组合以上过程,运行得到文档,经人工调整完成本次查询服务。
步骤S3中,设计面向多维数据ETL工具,其中配置文件Config.json,多值可通过嵌套实现,多维数据转换ETLmain算法,其中输入是根据路径读取配置文件中的数据得到Public、Data、Dim和Table四类数据:Public(year、city);Data(column_start、columns);Dim(row_start、row、row_code_num、sql_model_table);Table(数据:excel_data,总行数:total_row,开始行row_start),流程通过调用delete.json文件进行删除或更新操作,判断row_start是否小于total_rows,构造多维度模型sql_model和value两个向量,组合成可执行的insert_sql_model语句,实现数据转换,将多维数据按二维数据格式存储到关系数据库中的表中。
在步骤S4中,先在系统架构中引入分布式协调服务框架ZooKeeper来完成分布式集群管理和集群资源调度的工作,再采用Django框架实现简单的集群管理功能,达到分布式系统配置文件的配置、节点的部署情况查看和节点的状态监控,ETL执行节点分布在集群的子节点上,执行具体的任务,将数据从源数据库抽取到目标数据库中,元数据库中存储着ETL执行节点所需的配置信息。
ETL接入Kafka集群,大数据生产者创建消息,将消息发送到Kafka集群,消费者从Kafka集群中获得消息,进而进行业务逻辑处理,python接入kafka有两个常用库:kafka-python,pykafka。
设置了日志管理和API 服务管理,日志管理记录了系统运行状态和各节点的运行状态,API服务提供整个系统的REAEST服务,用于对接第三方应用,通过wsgiref快速实现接口。
通过上述描述可以看出,本方案本专利选择python语言设计ETL工具,可使用Scikit-learn、PyTorch、Tensorflow和MxNet等库,可将原始数据转换为表、图和树的结构,或深度学习和机器学习应用程序所接受的向量、矩阵、张量等格式,实现了面向不同计算平台和应用环境对各种数据进行格式、存储、提取、转换和移动管理,弥合数据工程和数据分析之间的鸿沟,解决了来源广泛、格式异构、需求不定、业务复杂等数据处理问题,为高质量支撑服务和系统级应用研究的提供重要支撑。
附图说明
图1是处理不同需求的ETL工具示意图。
图2是数据工程中处理三种类型数据的整体方案示意图。
图3是对ETL工具功能模块化分割流程图。
图4是面向查询服务的ETL工具构建流程图。
图5是指标体系构建多维表转换方法示意图。
图6是多维数据转换ETLmain算法流程图。
图7是分布式ETL工具部署框架示意图。
图8是ETL工具接入Kafka集群示意图。
具体实施方式
下面将结合本发明具体实施方式中的附图,对本发明具体实施方式中的技术方案进行清楚、完整地描述,显然,所描述的具体实施方式仅仅是本发明一种具体实施方式,而不是全部的具体实施方式。基于本发明中的具体实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他具体实施方式,都属于本发明保护的范围。
本方案提供了一种基于模块可编程扩展的ETL工具构建方法,支持结构化和非结构化数据,及其他扩展数据格式(如视频、音频、二进制数据);支持复杂和密集的计算,可以运行用户自定义函数;可以快速处理实时的高效的ETL工作流和分析大量的数据;可根据业务需求对ETL工作流进行有效的设计和灵活的改进,减少ETL开发人员的工作。针对数据工程中,数据处理遇到的大量频繁查询、复杂交叉转换、分布式实时处理等问题,设计了如附图1所示三类ETL工具重点关注内容。
在附图2中对数据工程中处理三种类型数据的整体方案进行了描述。包括数据源、数据处理和数据应用三个层次。数据源包括关系数据库、非结构化的数据和实时流数据,关系数据和低容量数据可通过数据集成工具处理后存储到数据库中,或者经过Spark ETL集群模块和Hadoop集群中分布式负载代理DLA(Distributed Load Agent)处理后,存储到HDF或者OSS(Object Storage Service),不仅可以处理数据仓库多维度数据和云存储中的数据,还可以执行复杂的聚合和运行机器学习算法,能够动态地添加新节点和利用集群上的所有可用资源。然而,如果有大量、高速、多样化和有价值大数据流产生时,传统的ETL方法就不再适用,图2中描述了针对大型数据生产者通过三个组件处理高速大数据的方法。其中,分布式流平台(DSP)可以每秒处理上千个事件,事件被保存在DSP队列中,然后流拉应用程序或自动触发的Lambda函数将数据存储在S3对象存储或者blob云存储中。
本专利基于模块化规范的设计方法,将系统分解成不同的且相互独立的模块进行开发,每个模块之间没有必然的联系,互不影响。根据用户的需求,可快速选择模块进行组装实现功能,实现灵活的设计。采用JSON格式文件对工作流和预定义任务进行建模,用于系统构件和业务流程模型描述,对ETL工具模块化分割如图3所示。基于构件模型和构件关系,借鉴代理和中介模式解决构件紧耦合方法,对ETL系统功能模块化分解,为扩展、构件的重复使用奠定基础。每个构件由类、函数和变量组成,是独立的和可组装、替换、配置、编程和执行的程序模块,对内构件参数覆盖功能,对外提供一组规范化接口,符合一定标准。构件容器对构件进行统一管理,包括加载、装配、卸载、更新和监控。在功能组装时,可根据系统不同功能,在构件库中选择合适的构件,再通过编程或者配置文件实现构件间的连接,完成系统的快速组装。
本方案针对多维度关系表格或者关系数据库表,对ETL工具解构,图3框架包括数据源的管理、数据引擎、读取写入、公共维度、数据维度、源表解析、目标表解析、更新删除、读取配置、ETL主执行模块、异常处理、日志管理、运行监控等。各模块采用逻辑和参数配置分离设计模式,以配置文件形式实现定位和具体功能,并将变量封装在轻量级json格式的数据文件中。其中,数据源模块包括关系数据库、半结构化数据(如xlxs、csv格式文件)、非结构化数据(如doc、txt格式文件)和外部API,并使用完整的数据字典形式详细记录的各类数据源,如数据库的名称、类型、访问方式、主机名称等;数据操作引擎模块包括JDBC、HTTP等访问数据源的方法;读取、写入模块负责数据的读写;源数据从维度和数据层面进行分析,其中维度又分为公共、私有维度,源表、目标表解析模块是依据具体的表结构设计的解析和存储代码实现方法,更新、删除模块从另一条线路负责数据工程中单独表的特殊操作。ETL管理包括异常处理、日志管理、运行监控等模块。
面向查询服务的ETL工具,在数据查询服务中,针对集成工具在数据工程中应具有批量数据查询和导出合适格式的数据的功能,但常用工具难以处理此类需求的问题的需求。按照ETL工具处理流程,依据数据查询流程图,基于模块化构件库,设计了一种面向查询服务的ETL工具构建方法,可快速数据处理。构建流程如图4所示:第一步,在pycharm中新建项目或模块,根据源数据库的类型从构件库中选择合适的输入数据引擎读取构件、写入构件、报表生成构件等,接入源数据所在数据库;进一步,配置源表解析模块,包括多条sql查询语句文档和逻辑代码执行程序,或者根据需求编写新的业务处理逻辑;再进一步,根据目标数据格式配置输出数据引擎模块,将查询结果存到txt、excel报表或者数据仓库中;最后,通过主函数组合以上过程,运行得到文档,经人工调整完成本次查询服务。
面向多维数据ETL工具,针对ETL过程中多维数据交叉转换问题,本专利基于提出的模型和方法,实现了一套多表头的Excel表格数据抽取到关系数据库的工具,具体如附图5所示。同时,形成了一种构建指标体系的多级表头处理方法:表1是统计中常见的数据存储格式,这种对多级表头的表格方便日常的数据使用,但不适合数据存储、程序操作和指标管理,将表1转换为表3的格式,既解决了多维多级表头二维存储问题,又方便系统级的操作和指标体系的管理。数据样例转换过程如表1、表2、表3所示,即需要将表格中的数据转换成二维形式在数据表中存储。具体步骤为首先,从表1中提取出四个维度:公共维度DimYear和DimCity,其他维度Type和指标维度Index;其次,把这四个维度表分别存储到数据库中,在本文中把四个维度的结构和值一起存储在了表2中;然后,把表1中的值转换为表2中各维度数值对应的id,最重要的特点是把GDP(亿元)和增长率(%)两列也变成了表三中的指标维度;最后,把表3存储到数据库中,最终实现数据和多个维度组合唯一对应的关系。基于模块化方法和转换过程描述,设计面向多维数据ETL工具,其中配置文件Config.json如下表所示,多值可通过嵌套实现。
多维数据转换ETLmain算法如附图5所示,其中输入是根据路径读取配置文件中的数据得到Public、Data、Dim和Table四类数据:Public(year、city);Data(column_start、columns);Dim(row_start、row、row_code_num、sql_model_table);Table(数据:excel_data,总行数:total_row,开始行row_start)。流程通过调用delete.json文件进行删除或更新操作,判断row_start是否小于total_rows,构造多维度模型sql_model和value两个向量,组合成可执行的insert_sql_model语句,实现数据转换,将多维数据按表3格式存储到关系数据库中的表中。
面向大数据的ETL工具,在任务作业多、转换数据量大和实时数据的情况下,运行在本地服务器的客户端,会出现消耗资源过高,单节点系统资源阻塞,数据转换性能急剧下降的现象,更无法和HDFS文件系统、MapReduce分布式计算等大数据技术相结合。所以针对以上问题,本节设计了面向大数据的分布式ETL工具,通过B/S架构web管理系统,对ETL分布式集群进行管理,共同配置部分由ZooKeeper统一管理,可通过消息中间件Kafka集群实现消息的转发,具体实现如附图6所示,其中的Y代表是,N代表否。
本方案的设计是在需求分析的基础上,先在系统架构中引入分布式协调服务框架ZooKeeper来完成分布式集群管理和集群资源调度的工作,再采用Django框架实现简单的集群管理功能,达到分布式系统配置文件的配置、节点的部署情况查看和节点的状态监控。ETL执行节点分布在集群的子节点上,执行具体的任务,将数据从源数据库抽取到目标数据库中,元数据库中存储着ETL执行节点所需的配置信息,如附图7所示。
附图8是ETL接入Kafka集群,生产者创建消息,将消息发送到Kafka集群,消费者从Kafka集群中获得消息,进而进行相应的业务逻辑处理。python接入kafka有两个常用库:kafka-python,pykafka。本节通过kafka-python实现,建立消费端群组。同时,系统设置了日志管理和API 服务管理,日志管理记录了系统运行状态和各节点的运行状态,API服务提供整个系统的REAEST服务,可以对接第三方应用,通过wsgiref快速实现接口。
以上所述仅为本公开的优选具体实施方式,并不用于限制本公开,对于本领域的技术人员来说,本公开可以有各种更改和变化。凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。