基于XML描述的可编程函数式ETL实现


基于XML描述的可编程函数式ETL实现

文章插图
 
转载本文需注明出处:微信公众号EAWorld,违者必究 。
引言:传统 ETL 主要以 SQL 为主要技术手段,把数据经抽取、清洗转换之后加载到数据仓库 。但是在如今移动互联网大力发展的场景下,产生大量碎片化和不规则的数据 。政府,公安等行业,传统数据库已经远远无法满足需求 。数据原始文件通过文件导入到基础库,再通过大数据 HQL等技术手段提取出二级库,这中间的数据导入和 SQL ETL 的提取的过程,大量消耗 IO 性能和计算资源,在很多场景下已经是数据处理的瓶颈所在 。
普元在实施公安项目过程中开发了一种基于 XML 描述的可编程的函数 ETL 转换方法 。主要用于大数据文件处理领域,能从原始数据文件直接、快速加载到专题库的技术手段 。技术方案主要解决了用 XML 的技术手段描述数据文件的格式,包含文件字段切分、字段类型、默认值、异常值校验、时间格式校验 。在处理时可添加自行开发的 JAVA UDF 函数,函数实参支持变量、常量、表达式、函数和运算符重载 。同时函数支持多层嵌套,即内部函数的返回值最为外部函数的实参 。该方案实现了 XML 内函数体的语法解析并在运行过程中直接编译为 Java 字节码的技术 。有效的解决了政府、公安、电信行业巨量的数据处理需要的大量计算资源和 IO 性能瓶颈,有效的提高了数据处理效率和降低了数据处理开发难度 。
目录:一、基于 XML 控制文件解析数据文件方案介绍
二、XML 控制文件结构和语法
三、函数和多层嵌套函数传参
四、UDF 函数编写方法
五、数据测试工具
六、FlumeOnYarn 架构和分布式部署
一、基于 XML 控制文件解析数据文件方案介绍对于数据开发项目,我们常常会面临众多的数据对接,部分场景不仅数据量大,且数据种类多,数据解析开发工作量巨大 。对于大量数据对接,一般设计的 RPC 接口和 WebService 一般都达不到数据性能要求的 。并且他们都是点对点的服务,一旦上下游系统故障,都会造成整个数据对接异常 。因此大部分都会选择使用文件的方式进行数据对接 。
基于XML描述的可编程函数式ETL实现

文章插图
 
对于非实时数据对接需求,这种方式的优点:
  1. 在数据量大的情况下,可以通过文件传输,上游只写入,无需关心数据业务和故障;
  2. 方案简单,避免了网络协议相关的概念;
  3. 维护简单,只需保证磁盘写入稳定性即可;
我们常常会面临基于此架构的数据对接 。但基于此架构数据处理工作都在下游(即数据使用方) 。
面对大量数据对接和众多的数据类型,我们对于每种数据文件解析、解码、清洗消耗大量的人力,并且基于编码的方式对于较多数据类型的场景代码量大,且难以管理 。因此经过多次数据开发实践,我们开发了一种基于 XML 描述的方式来解析和清洗数据文件的实现 。
本架构实现适合以下几个方面:
  1. 基于文件的数据对接;
  2. 文件无法直接导入到目标数据库,需要做转换,清洗为目标格式;
如上数据对接架构图,Flume 基本实现了基于文件系统的自动扫描和读取,因此架构实现了基于 Flume Sink 的模块 。本架构也可作为SDK 作为框架集成到现有数据处理方案中 。
二、XML数据控制文件结构和语法<?xml version="1.0" encoding="UTF-8"?><schema><key>JD_TYPE_V1</key><type>textfile</type><delimiter>,</delimiter><fields><field type="int">exp_flag</field> <field type="string">sender_id</field><field type="string">sender_num</field> <field type="string" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/"unknown">sender_address receiver_num expect_time receiver_num_origin is_sender_num_null number_connect all_num_null sender_province_code 如上 XML 描述了一种数据文件类型及该类型的切分方法,数据每行经过切分后,产生的多个数据列的转换方法 。


推荐阅读