ETL流程介绍&常用实现方法


1、概述

        ETL是英文Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。常见于数据仓库开发中将数据由业务系统归集到数据仓库(DW: DataWarehouse)或者数据集市的过程。ETL是BI项目重要的一个环节。 通常情况下,在BI项目中ETL会花掉整个项目至少1/3的时间,ETL设计的好坏直接关接到BI项目的成败。

        ETL的设计分三部分:数据抽取、数据的清洗转换、数据的加载。数据的抽取是从各个不同的数据源抽取到ODS(Operational Data Store,操作型数据存储)中——这个过程也可以做一些数据的清洗和转换。ETL三个部分中,花费时间最长的是“T”(Transform,清洗、转换)的部分,一般情况下这部分工作量是整个ETL的2/3。数据的加载一般在数据清洗完了之后直接写入DW(Data Warehousing,数据仓库)中去。

        ETL的实现有多种方法,常用的有三种。一种是借助ETL工具(如Oracle的OWB、SQL Server 2000的DTS、SQL Server2005的SSIS服务、Informatic等)实现,一种是SQL方式实现,另外一种是ETL工具和SQL相结合。前两种方法各有各的优缺点,借助工具可以快速的建立起ETL工程,屏蔽了复杂的编码任务,提高了速度,降低了难度,但是缺少灵活性。SQL的方法优点是灵活,提高ETL运行效率,但是编码复杂,对技术要求比较高。第三种是综合了前面二种的优点,会极大地提高ETL的开发速度和效率。


2、抽取作业(Extract)

        从源数据库(通常为业务系统)获得数据的过程。
        在做这一步的之前,往往要预先分析自己需要什么数据,划分好范围,确认具体的技术部门和业务部门。
        首先,要搞清楚数据是从几个业务系统中来,各个业务系统的数据库服务器运行什么DBMS(Database Management System),是否存在手工数据,手工数据量有多大,是否存在非结构化的数据等等,当收集完这些信息之后才可以进行数据抽取的设计。

2.1 手工开发抽取作业时候的常用方法

2.1.1 当数据源和DW为同一类数据库时

        一般情况下,DBMS(SQLServer、Oracle)都会提供数据库链接功能,可以在数据源(业务系统)和DW数据库服务器间建立直接的链接关系(如DB2的联邦数据库NICKNAME),然后在DW内直接SELECT访问。
        优点是实现使用简单,逻辑简单。
        缺点是容易被滥用对源数据库造成较大的负载压力。

2.1.2 当数据源和ODS为不同类型数据库时

o 将源数据库的数据导出为文本文件(.txt或.xls文件),利用FTP协议进行传输导入ODS区域。
        优点是实现简单,对源系统压力较小。
        缺点是传输步骤增加了,处理需要的时间增加。

o 将部分数据库间能通过ODBC建立源数据库和目标数据库链接(如SQL Server和Oracle之间),此时也能直接使用SELECT获取数据。
        优点是实现使用简单,逻辑简单。
        缺点是容易被滥用对源数据库造成较大的负载压力,且建立时较为复杂。

ODBC(Open Database Connectivity,开放数据库连接) 是为解决异构数据库间的数据共享而产生的,现已成为WOSA(The Windows Open System Architecture, Windows开放系统体系结构)的主要部分和基于Windows环境的一种数据库访问接口标准。ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据;使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件,甚至访问如Excel 表和ASCI I数据文件这类非数据库对象。

2.2 更新数据的时间和数量的问题

2.2.1 实时抽取数据

       这类抽取方式在数据仓库中很少见到,因为一般来说数据仓库对数据的实时性要求并不高。实时抽取常见于BI中的CRM系统,比如在实时营销中,客户一旦进行了某类操作就实时触发对应的营销行为。

  • 时间戳方式
           要求源表中存在一个或多个字段(时间戳),其值随着新纪录的增加而不断增加,执行数据抽取时,程序定时循环检查通过时间戳对数据进行过滤,抽取结束后,程序记录时间戳信息。
           优点是对源系统的侵入较小。
           缺点是抽取程序需要不断扫描源系统的表,对其有一定压力。

  • 触发器方式
           要求用户在源数据库中有创建触发器和临时表的权限,触发器捕获新增的数据到临时表中,执行抽取时,程序自动从临时表中读取数据。
           优点是实时性极高。
           缺点是对源系统的侵入性较大,同时会对源数据库造成很大的压力(行级触发器),很可能影响源系统的正常业务。

- 程序接口方式
       改造源系统,在修改数据时通过程序接口同步发送数据至目标库,发送数据的动作可以跟业务修改数据动作脱耦,独立发送。
       优点是对源系统的造成压力较小,实时性较强。
       缺点是需要对源系统的侵入性较强,需要源系统做较大的改造。

2.2.2 批量抽取数据

       为了保证数据抽取时数据的准确性、完整性和唯一性,同时降低抽取作业对源数据库造成的压力,抽取作业的加载必须避开源数据的生成时间。这种方法一般用于实时性要求不高的数据。比如T+1或者每月1日进行抽取。

2.2.2.1 常用实现
  • 日志检查
           需要源数据库生成数据完毕之后,在外部生成日志。抽取程序定时检查源系统的执行日志,发现完成标志后发起抽取作业。
           优点是可靠性高,对源数据库造成的压力较小。
           缺点是需要源数据库配合生成可供检查的外部日志。

  • 约定时间抽取
           可以直接约定一个加载完毕且对源数据库压力较小的时间(如每日凌晨2点),抽取程序建立定时任务,时间一到自动发起抽取作业。
           优点是对源数据库的侵入性和造成的压力较小。
           缺点是可靠性不高,可能会发生数据未生成完毕也直接进行抽取的情况。

2.2.2.2 全量下载&增量下载

       根据下载时候对数据的筛选方式可以分为

o 全量下载
适用于:

  • 源数据量较小,如维表。
  • 数据变化较大,比如90%的数据都产生了变化的表。
  • 变化的数据不能预期,无法标示,如账户表。
           优点在于下载较为简单且能容纳任何情况的数据变化;
           缺点是如果数据量较大,需要抽取相当长的时间,同时会占用大量的IO和网络资源。

o 增量下载
常用于数据只增不减的表,如交易明细表等。

  • 时间戳
           源系统在修改或添加数据时更新对应的时间戳字段(如交易表的日期字段),抽取程序根据时间戳选择需要更新的数据进行抽取。

  • 触发器方式
           要求用户在源数据库中有创建触发器和临时表的权限,触发器捕获新增的数据到临时表中,到执行抽取的时间时,程序自动从临时表中读取数据。占用资源较多,不建议使用。
           优点是下载的数据较小,速度较快,占用资源少;
           缺点是使用限制较大,有时候需要源系统进行改造支持。


3、转换作业(Transform)

       这一步包含了数据的清洗和转换。

3.1 数据清洗

       数据清洗的任务是过滤不符合条件或者错误的数据。

       这一步常常出现在刚刚开始建立数据仓库或者源业务系统仍未成熟的时候,此时发现错误数据需要联系源业务系统进行更正,部分可预期的空值或者测试用数据可以过滤掉。

3.2数据转换

       这是整个ETL流程中最为占用时间和资源的一步。

       数据转换包含了简单的数据不一致转换,数据粒度转换和耗时的数据关联整合或拆分动作。这里可能存在各种各样千奇百怪的需求。对于核心数据仓库来说,里面往往是对数据进行按照主题划分合并的动作。同时,也会添加一些为了提升执行效率而进行反范式化添加的冗余字段。

       根据实现方式的不同,可以区分为使用数据库存储过程转换和使用高级语言转换

o 使用数据库存储过程转换

       使用SQL开发存储过程完成转换作业是很多银行常用的方法。
       优点是开发简单、能支持绝大部分转换场景;
       缺点在于占用资源多且受制于单一数据库性能,无法做到横向扩展。

       因此,除了业务的理解能力外,对SQL海量数据处理的优化能力在此也非常重要。比如:

  • 利用数据库的分区性,选择良好的分区键。
  • 建表时合理选择主键和索引,关联时候必须使用主键或索引进行关联。
  • 关注数据库对SQL的流程优化逻辑,尽量选择拆分复杂SQL,引导数据库根据你选择流程进行数据处理
  • 合理反范式化设计表,留出适当的冗余字段,减少关联动作。

       具体的优化根据不同的数据库有着不同的处理方式,根据所选用的数据库不同而定。

o 使用高级语言转换

       使用高级语言包含了常用的开发C/C++/JAVA等程序对抽取的数据进行预处理。
       优点是运行效率较高,可以通过横向扩展服务器数量来提高系统的转换作业处理能力;
       缺点是开发较为复杂,同时虽然能进行较为复杂的逻辑的开发,但是对于大数据量的关联的支持能力较弱,特别是有复数的服务器并行处理的时候。


4、加载作业(Load)

       转换作业生成的数据有可能直接插入目标数据库,一般来说,这种情况常见于使用数据库存储过程进行转换作业的方案。此时,ETL作业位于目标数据库上,加载作业只需要使用INSERT或者LOAD的方式导入目标表即可。此时转换作业和加载作业往往是在同一加工中完成的。

       当使用高级语言开发时,ETL作业有着专门的ETL服务器,此时,转换作业生成的往往是文本文件,在转换作业完成后需要使用目标库特有的工具导入或者通过INSERT入目标库。

       同时,根据抽取作业的数据抽取方式的不同(全量、增量),对目标表进行替换或者插入动作。


5、流程控制

       抽取加载和转换作业需要一个集中的调度平台控制他们的运行,决定执行顺序,进行错误捕捉和处理。

       较为原始的ETL系统就是使用CRON做定时控制,定时调起相应的程序或者存储过程。但是这种方式过于原始,只能进行简单的调起动作,无法实现流程依赖行为,同时按步执行的流程控制能力也弱,错误处理能力几乎没有。只适合于极其简单的情况。

       对于自行开发的较为完善的ETL系统,往往需要具有以下能力:

  • 流程步骤控制能力
           调度平台必须能够控制整个ETL流程(抽取加载和转换作业),进行集中化管理,不能有流程游离于系统外部。

  • 系统的划分和前后流程的依赖
           由于整个ETL系统里面可能跨越数十个业务系统,开发人员有数十拨人,必须支持按照业务系统对ETL流程进行划分管理的能力。

       同时必须具有根据流程依赖进行调度的能力,使得适当的流程能在适当的时间调起。

  • 合理的调度算法
           同一时间调起过多流程可能造成对源数据库和ETL服务器还有目标数据库形成较大负载压力,故必须有较为合理的调度算法。

  • 日志和警告系统
           必须对每一步的流程记录日志,起始时间,完成时间,错误原因等,方便ETL流程开发人员检查错误。对于发生错误的流程,能及时通知错误人员进行错误检查和修复。

  • 较高可靠性


6、常用商业ETL工具

       常用的ETL工具有Ascential公司的Datastage、Informatica公司的Powercenter、 NCR Teradata公司的ETL Automation等。

  • Datastage

       是使用高级语言进行开发ETL服务器的代表。使用JAVA进行开发E/T/L的整个流程,同时支持平行添加服务器提升处理效率的方法。

  • Automation

       基于Teradata的TD数据库的ETL调度框架。其ETL流程是使用DSQL的存储过程进行开发,利用TD数据库的海量数据处理能力,也具有一定的平行扩展能力。

参考文献:ETL讲解(很详细!!!)

  • 7
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ETL(Extract-Transform-Load)是数据仓库中常用的一种数据处理方式,它的主要目的是从各种数据源中提取(Extract)数据,然后进行数据转换(Transform)和数据加载(Load)到目标数据仓库中。ETL开发的流程大致可以分为以下几个步骤: 1. 数据源分析:ETL开发前需要对数据源进行分析,包括数据结构、数据格式、数据质量等方面的分析。 2. ETL设计:在数据源分析的基础上,设计ETL流程,包括数据抽取、数据转换和数据加载等操作。 3. ETL开发:根据ETL设计,进行ETL开发,实现数据抽取、数据转换和数据加载等操作。 4. ETL测试:ETL开发完成后,需要进行测试,包括单元测试、集成测试和系统测试等,确保ETL流程的正确性和稳定性。 5. ETL部署:ETL测试通过后,需要将ETL流程部署到生产环境中,保证数据的准确性和时效性。 关于学习路线,ETL开发涉及到数据仓库、数据库、数据挖掘等多个领域,学习路线可以大致分为以下几个方面: 1. 数据库基础:ETL开发需要涉及到数据库的操作,因此需要掌握SQL语言和关系型数据库的基本概念和操作。 2. 数据仓库基础:ETL开发的目的是将数据加载到数据仓库中,因此需要了解数据仓库的概念、架构和设计方法。 3. ETL工具:市面上有很多ETL工具,如Informatica、Talend、DataStage等,需要学习其中一款ETL工具的使用。 4. 数据挖掘:ETL开发的目的是为了支持数据挖掘和分析,因此需要了解数据挖掘的基本概念和方法。 总之,ETL开发需要综合掌握多个领域的知识,需要花费一定的时间和精力进行学习和实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值