4.1.1 DataStage的优化策略
4.1.1.1 充分利用并行处理功能(有效度:★★★★★)
数据仓库系统的数据源大都以几个交易系统为基础,结合了多个应用系统和外部的数据源,银行业中涉及到电话银行、手机银行、自动取款、银行卡等多种业务,包括了总账、分户账、账户明细等各个层面的数据,数据量非常大。
DataStage具有专有的并行处理组件和良好的并行处理能力。
为了提高数据处理效率,充分利用系统资源,在数据处理的设计方案中可充分利用ETL并行数据处理功能。
系统数据处理流程中采用的并行处理方式主要包括以下两种:
(1) 分析数据处理流程 没有依赖关系的数据处理可以并行执行。数据仓库系统的数据模型是一个有机的整体,但在数据处理过程中并不是完全互相依赖、密不可分的,对于没有前驱后继关系的数据处理模块可以并行执行。通过分析与设计,理清数据处理流程中的数据处理模块及它们之间的依赖关系,发现数据处理结构的特点,然后不同分支上的数据处理模块可并行执行。
(2) 拆分源文件 使同一数据源中不同特点的数据可以并行处理。在同一数据源文件中,经常存在着不同特点的数据,需要按照不同的规则进在同一数据源文件中,经常存在着不同特点的数据,需要按照不同的规则进行匹配和处理。当面对大量数据时,这种处理往往非常耗时,甚至不能在用户接受的时间内完成。在此情况下,使用外部程序对文件拆分,将不同特点的数据拆分到不同的文件中,这样后续的数据处理面对的是多个没有依赖关系的数据源,这些数据处理也是可以并行执行的。如银行分户帐余额积数文件,可将其拆分为贷款户、定期户、往来户、表外户、财务户和内部户,每种帐户的数据处理规则单一,且面对的源数据量大大减小,从而缩短了整个分户帐数据处理的时间。 4.1.1.2 调整源数据在磁盘上的分布(有效度:★★★★★)
由于数据的读写对磁盘的I/O依赖比较强,我们尽量将不同的数据分配到不同的文件系统,这些文件系统被mount到不同的磁盘上,如增量文件、全量文件、Scratch目录、Datasets目录,以及目标文件的存放。
对于同样的数据存放到了一组磁盘上面,我们也尽量让这些数据是以分散的跨盘存储的方式读取。数据的读取效果将有比较明显的改善。
4.1.1.3 在读入文件是采用多readers(有效度:★★★★)
无论是用Sequential File Stage还是用Comples File Stage,都有一个可调的选项:
Number of Readers Per Node,其缺省值为1,它的意义是在每个Node上,开N个读取数据的进程。适当调整这个参数,提高读取数据的并行度,可以明显提高读取的效率。
同时运行多个Job时,总的Readers数量不要超过总的CPU数目。
4.1.1.4 去掉字段中的Unicode编码方式(有效度:★★★)
在导入Table Definition时,可以选择按照Unicode的编码方式进行导入,由于通常数据文件并是按照ASCII编码的,所以DataStage在读入后要进行转码。转码会消耗很多的处理时间,会大大延长整理读取处理的时间。
4.1.1.5 调整读写Buffer(有效度:★)
该参数存在于每一个Stage的Input和Output的Advance page中,它主要是调节每一个Buffer使用的模式,其中包括每个Buffer所使用的虚拟内存的大小等。对于数据长度小于32k时不建议修改Buffer大小,修改不当容易引起DeadLock.
4.1.1.6 对于数据较大的表,改用Join Stage替代Lookup Stage(有效度:★★)
通常会用Lookup Stage做有关数据的匹配查找工作。对于Lookup Stage的Reference Link,DataStage会尽可能将数据放到内存中,并且只有当所有的Refence Link数据都读取完毕,Lookup Stage才会开始工作,所以当其数据量较大的时候(超过了内存的大小),推荐用Join Stage的内连接来实现相同的功能。
4.1.1.7 用LookUp File Set 代替 Sequential file做Refence Link(有效度:★★★)
常用Sequential File Stage来作为Lookup Stage的reference link的输入,在数据量很小的情况下,好像这种方式不会影响效率。但如果数据量比较大,接近了内存的大小,那么DataStage会推荐使用Lookup file set作为Lookup reference的输入。虽然生成Lookup file set需要单独的Job生成,但这对于Lookup效率的提升,还是很值得的。
在多个Job需要使用相同的Refence Link的情况下或者Refence Link长期不发生变化,这种方式应该会更加有效。
4.1.1.8 用Data Set 代替 Sequential File做临时的中间文件(有效度:★★★)
任何外部的数据被读入后都会执行partition操作,被分割为若干份。而当使用DataSet作为源数据可以沿用DataSet的Partition方式,避免了Partition的操作,提高运行速度。
当因为整体架构中需要多次保存中间文件,推荐使用DataSet作为中间文件的保存格式。虽然我们可以使用Number of Readers per Node来加快Sequential File的读取速度,但是这并不能避免Partition操作。
4.1.1.9 字段合并及字段过滤(有效度:★★)
当整个处理流程只需要部分源数据字段时,最好通过Copy Stage或者Sequential File Stage的Drop on input筛选字段。如果源为DB时,则只选择需要的字段。尽可能减少处理过程中系统资源的消耗。
某些时候之需要处理部分字段,但是需要输出所有字段。推荐将连续的,不参与运算的字段进行合并处理。这样可以减少数据的解析,减少处理量。让工具只需要处理较少的需要转换的字段。对于多个不参与运算的字段连在一起的情况下,这种处理方式也有很好的效果。
4.1.1.10 减少Transformer Stage及Parallel Routine的使用(有效度:★★)
用其他Stage替换Transformer Stage对效率的提高也会有帮助。比如,用modify stage处理null值及做类型转换;用filter stage做数据分流等等。
Parallel Routine是以C++语言编写的,存放在Server端,会被编译为C++ Operator。尽量少用Parallel Routine。当一个复杂的逻辑需要十数个Stage完成,可以酌情考虑用Parallel Routine替换。