Friday 5 September 2008

本人理解之五:ETL的抽取策略(ZZ)

本文所提到的数据加载策略为OLTP系统作为源系统,并进行ETL数据加载到OLAP系统中所采用的一般数据加载策略。依循数据仓库的工作方式,原始资料由源数据库被抽取出来后,将在中间过程被写入到” Operational Data Store”(ODS),ODS是被设计用来存储中间数据和核查校验数据的。通过ODS,数据将被萃取、预先被计算及整理,而后被导入数据仓库作进一步的报表生成与分析。所以通常意义的ETL过程涵盖了两个方面的内容:1. 从源数据库到中间步骤的ODS; 2. 从ODS到最终的数据仓库。目标数据库存放数据的时间区间比源数据库长。例如源数据库存放的是3个月的交易生产数据,ODS存放了1年左右的数据,而数据仓库存放了3-5年的历史数据。

一般ETL数据加载存在以下几种方案:

1、 时戳方式

需要在OLTP系统中业务表中统一添加时间字段作为时戳(如表中已有相应的时间字段,可以不必添加),每当OLTP系统中更新修改业务数据时,必须同时修改时戳字段值。当作ETL加载时,通过系统时间与时戳字段的比较来决定进行何种数据抽取。

优点:ETL系统设计清晰,源数据抽取相对清楚简单,速度快。可以实现数据的递增加载。

缺点:时戳维护需要由OLTP系统完成,需要修改原OLTP系统中业务表结构;且所有添加时戳的表,在业务系统中,数据发生变化时,同时更新时戳字段,需要对原OLTP系统业务操作程序作修改,工作量大,改动面大,风险大。但如果业务表在最初设计的时候考虑到这点,应用此方案是最好的选择。

2、 日志表方式

在OLTP系统中添加系统日志表,当业务数据发生变化时,更新维护日志表内容,当作ETL加载时,通过读日志表数据决定加载那些数据及如何加载。

优点:不需要修改OLTP表结构,源数据抽取清楚,速度较快。可以实现数据的递增加载。

缺点:日志表维护需要由OLTP系统完成,需要对OLTP系统业务操作程序作修改,记录日志信息。日志表维护较为麻烦,对原有系统有较大影响。工作量较大,改动较大,有一定风险。

3、 全表比对方式

在ETL过程中,抽取所有源数据,并进行相应规则转换,完成后先不插入目标,而对每条数据进行目标表比对。根据主键值进行插入与更新的判定,目标表已存在该主键值的,表示该记录已有,并进行其余字段比对,如有不同,进行Update操作,如目标表没有存在该主键值,表示该记录还没有,即进行Insert操作。

优点:对已有系统表结构不产生影响,不需要修改业务操作程序,所有抽取规则由ETL完成,管理维护统一,可以实现数据的递增加载,没有风险。

缺点:ETL比对较复杂,设计较为复杂,速度较慢

4、 全表删除插入方式

每次ETL操作均删除目标表数据,由ETL全新加载数据。

优点:ETL加载规则简单,速度快。

缺点:对于维表加代理键不适应,当OLTP系统产生删除数据操作时,OLAP层将不会记录到所删除的历史数据。不可以实现数据的递增加载。

5、 设置触发器方式

通过在源系统的数据库中设置触发器,每当有Update、Insert、Delete操作时触发一个事件将发生改变的记录抽取到相应的临时表中。

优点:ETL加载规则简单,速度快,不需要修改OLTP表结构,可以实现数据的递增加载。

缺点:对源系统性能有一些影响。需建立一张临时表。

6、 利用Oracle变化数据捕捉(Change Data Capture,CDC)特性

CDC特性是在Oracle9i数据库中引入的,它简化了识别自上次提取后发生变化的数据的过程。CDC能够帮助识别从上次提取之后发生变化的数据。利用CDC,在对源表进行Update、Insert或Delete等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。

4@5l@4@11@9@11@9@5xe" o:preferrelative="t" filled="f" stroked="f" coordsize="21600,21600" o:spt="75" />

一旦数据库做好了CDC准备,就可以按照以下步骤设置CDC环境:
1. 确定源表。
2. 设置发布者。
3. 创建变化表。
4. 设置订阅者。
5. 订阅源表并激活订阅过程。
6. 设置CDC窗口。
7. 准备订阅者视图。
8. 访问变化表中的数据。
9. 删除订阅者视图,并清除CDC窗口。
10. 重复第6到第9步,以查看新数据。
优点:提供了易于使用的API来设置CDC环境,缩短ETL的时间。不需要修改OLTP表结构,可以实现数据的递增加载。
缺点:对此特性还需研究。

对数据抽取方法的选择,首先要考虑的有哪些方法具有实施的条件,哪些方法没有实施的条件。方法实施的效率,因为每个源系统给予数据抽取的时间窗口有限,可以采用并行处理的方式,将一个大的数据抽取分成几个小的数据抽取进行并行处理。对于初始抽取采用静态数据抽取。对以后的抽取而言,如果用时间戳的方式可以实现,用时间戳的方式,因为这种方式根据时间标记比较容易判断出哪些数据已经抽取到临时存储区,哪些数据还没有进行抽取,我们只需要抽取哪些没有进行抽取的数据记录。如果不能采用时间戳的方式,可以考虑采用交易日志的方式,交易日志处理需要专门的程序。但是对一个数据库而言它的日志格式是固定的,目前主要是Informix、SQL Server等数据库,只需要编写这几种数据库日志格式处理的程序即可,而且不需要关心源系统,也不会影响到源系统。如果交易日志不能实现,采用多次抽取文件进行比较的方式。对于源程序中捕获的方式基本上不予考虑,如果涉及到的源系统很多,不可能修改每一个系统来为数据捕获。当然,也有可能是多种数据抽取方法的综合选择。

(1)、如果所集成OLTP系统为其他产商产品,则应尽量的降低因ETL而对现有系统产生的影响,及系统风险性。而性能的影响则可以通过两方面解决,一部分由硬件的升级进行解决,因为ETL除读表及写表操作外,所有转换均由ETL服务器在内存中完成,故高配置服务器将大大提升ETL运行速度;一部分由加载时机进行控制,加载时机采取在系统较为空闲时加载,同时并行多个加载等,可以降低对运行系统的影响。所以可以使用全表比对递增加载数据的方式作为此类系统的ETL数据加载规则。

(2)、如果原OLTP系统为自己开发产品,此次所作OLAP系统为在原系统上的系统,则可以考虑使用时辍或日志表方式,区别仅为对原系统的影响大小。

(3)、当数据实现递增加载时,OLAP系统中的聚合表,可由OLAP中的事实表数据二次ETL产生,此时由于OLAP数据的完整性与准确性,可以使用全表删除插入方式。

(4)、当数据实现递增加载时,对Oracle变化数据捕捉(Change Data Capture,CDC)特性非常了解的情况下,建议采用此方法。

No comments: