一 什么是ETL
ETL(extract提取、transform转换、load加载)。ETL负责将分散的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后,进行清洗、转换、集成,最后加载到数据仓库或数据集市中,成为联机分析处理、数据挖掘提供决策支持的数据。
二 使用Spark开发ETL系统的优势
- 由于海量的日志记录、交易记录,单机进行ETL变得越来越困难。搭建一套具备大规模数据处理能力的ETL系统成为大数据分析系统中不可或缺的环节。由于Spark在大数据处理能力上的高效率、及其简单易用的API、同时对各种数据库的访问都实现了良好的支持,使用Spark来开发搭建ETL成为一个不错的选择。
- 另外Spark DataFrame提供了详细的数据结构信息(即schema),使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。同时SPark DataFrame提供了丰富的操作API且可以直接基于DataFrame进行SQL操作,成为了ETL存储中间数据的首选。
- 部署简单,只需要使用spark-submit命令提交worker即可。
三 相关架构和功能实现
在此只介绍一些常用且使用spark开发容易实现的功能。
3.1 数据清洗、转换:
-
数据合并:多表关联合并,字段合并
-
数据拆分:按一定规则进行数据拆分
-
数据解析提取:利用Spark的UDF、UDAF、UDTF等特性,自定义数据语义解析函数。
3.2 数据加载
增量ETL:
- 使用时间戳作为增量字段,减小每次ETL的数据规模、提高数据ETL的效率。
- 使用自增序列值做增量ETL,系统自动记录上次ETL过程的截至序列值作为下一次ETL的增量序列值进行ETL。
全量ETL:
删除目标表数据,将源数据全部插入,同时对原始目标表数据备份。
3.3 异常处理
在ETL的过程中,必不可少的要面临数据异常而导致的ETL过程失败的问题,处理办法:
- 对于网络中断等外部原因造成的异常,设定尝试次数,
- 日志输出,记录ETL错误过程、执行的错误信息,Web方式查询及邮件通知。
四 相关组件、模块介绍
ETL_ON_SPARKEngine作为整个ETL的核心,主要承担一下几方面的职责:
1、负责从Hbase中读取配置库的配置数据,并制定任务调度计划。
2、解析数据获取语句,从数据源读取数据,以Spark DataFrame的形式暂存在Spark集群的内存中。从MySQL、Hive等结构化的数据库中读取数据比较好理解,就是一条Sql语句,最多在使用几个自定义函数。从hbase,MongoDB等半结构化的数据库中获取数据时,由于原始数据的字段具有层次关系、或者以Json等格式存在,需要进行字段的拆分、Json数据展平等过程。
3、对源Spark DataFrame进行字段转换与字段映射,生成一个新的Spark DataFrame。在这一步主要进行字段名称转换、字段类型转换、字段合并重组等操作。
4、将新的Spark DataFrame写入目标数据源中。