简介DataStage 使用了Client-Server 架构,服务器端存储所有的项目和元数据,客户端DataStage Designer 为整个ETL 过程提供了一个图形化的开发环境,用所见即所得的方式设计数据的抽取清洗转换整合和加载的过程。
Datastage 的可运行单元是Datastage Job ,用户在Designer 中对Datastage Job 的进行设计和开发。
Datastage 中的Job 分为Server Job, Parallel Job 和Mainframe Job ,其中Mainframe Job 专供大型机上用,常用到的Job 为Server Job 和Parallel Job 。
本文将介绍如何使用Server Job 和Parallel Job 进行ETL 开发。
Server Job一个Job 就是一个Datastage 的可运行单元。
Server Job 是最简单常用的Job 类型,它使用拖拽的方式将基本的设计单元-Stage 拖拽到工作区中,并通过连线的方式代表数据的流向。
通过Server Job,可以实现以下功能。
1.定义数据如何抽取2.定义数据流程3.定义数据的集合4.定义数据的转换5.定义数据的约束条件6.定义数据的聚载7.定义数据的写入Parallel JobServer Job 简单而强大,适合快速开发ETL 流程。
Parallel Job 与Server Job 的不同点在于其提供了并行机制,在支持多节点的情况下可以迅速提高数据处理效率。
Parallel Job 中包含更多的Stage 并用于不同的需求,每种Stage 使用上的限制也往往大于Server Job。
Sequence JobSequence Job 用于Job 之间的协同控制,使用图形化的方式来将多个Job 汇集在一起,并指定了Job 之间的执行顺序,逻辑关系和出错处理等。
数据源的连接DataStage 能够直接连接非常多的数据源,应用范围非常大,可连接的数据源包括:•文本文件•XML 文件•企业应用程序,比如SAP 、PeopleSoft 、Siebel 、Oracle Application•几乎所有的数据库系统,比如DB2 、Oracle 、SQL Server 、Sybase ASE/IQ 、Teradata 、Informix 以及可通过ODBC 连接的数据库等•Web Services•SAS 、WebSphere MQServer JobServer Job 中的Stage 综述Stage 是构成Datastage Job 的基本元素,在Server Job 中,Stage 可分为以下五种:1.General2.Database3.File4.Processing5.Real Time本节中将介绍如何使用Datastage 开发一个Server Job。
如图 1 所示:图 1. Server Job点击查看大图Sequential File StageSequential File Stage 可用来从一个Sequential 文件中获取源数据或将数据加载到一个Sequential 文件中。
在使用Sequential File Stage 时需要指定文件的路径和名称,文件的格式,列的定义和文件写入的类型(覆盖或追加)。
图 2. Sequential File 属性框点击查看大图图 3. Sequential File 列定义点击查看大图上图是本节例子中使用到的Sequence File。
在Input 页中,File Name 参数代表文件的实际路径,如果文件不存在将会被自动建立。
Update Action 中选择Overwrite existing file 表示此文件在加载数据之前将被清空;在Format 页中,定义文件的格式,例如分隔符,NULL 值,首行是否为列定义等;在Column 页中,需要输入文件的列定义。
Hash File StageHash File 以主键将记录分成一个或多个部分的文件,在Datastage 中通常被用做参考查找。
在进行参考查找的时候,Hash File 文件会被加载到内存中,因此具有较高的查找效率。
和Sequence File 类似,使用Hash File 时需要输入文件的实际地址,通过参数设置写入时的选项,并提供数据的列定义。
需要注意的是,Hash File 需要指定主键,如果未指定,第一列被默认为主键。
进行参数查找时,使用主键值在Hash File 中搜索,如果找到则返回该数据,如果未找到则返回NULL 值。
图 4. Hash File 属性框点击查看大图Transformer StageTransformer Stage 是一个重要的,功能强大的Stage。
它负责ETL 过程中的数据转换操作。
在Transformer Stage 中可以指定数据的来源和目的地,匹配对应输入字段和输出字段,并指定转换规则和约束条件。
图 5. Transformer Stage 列映射点击查看大图Transformer Stage 中分为5 个区域:左上方区域,是用表格形式描述的输入数据信息。
如果有多条输入数据流,则有很多表格。
本例中有一个输入,一个参照查询,因此左上方有两个表格。
右上方区域,是用表格形式描述的输出信息。
左下方区域为输入的元数据列定义,包括列名,类型和长度等属性。
右下方区域为输出的元数据列定义,包括列名,类型和长度等属性。
左上方和右上方的表格由带有流向的箭头连接,代表了字段的对应关系。
此例中,输入的数据只有一个字段EMPLOYEE_ID,通过此字段在Hash File 中进行参照查找,获取EMPLOYEE_NAME 字段。
如果在Hash File 中找到了EMPLOYEE_NAME 则将数据发送到输出端,这个条件是通过Transformer Stage 提高的约束功能实现,我们在约束中的定义为NOT(ISNULL(lkp_name.EMPLOYEE_ID))。
另外无论是否在Hash File 中查找到对应的数据,我们都将数据记录到一个csv 文件中,即对应的save_all 输出。
Parallel JobParallel Job 的Stage 综述与Server job 相比,Parallel Job 提供了更丰富的stage,增加了Development/Debug,Restructure 和Transactional 类的stage。
同时,对于一些在server job 中可以在transformer 中完成的功能,Parallel job 也提供了专用的stage 以提高运行性能和开发效率,比如lookup,join,Compare 等。
另外一个显著的区别是在Parallel Job 中内置地支持job 的并行运行,并行执行也就意味着数据在job 中的各个stage 见处理时需要处理partition 和combination 的问题,所以在开发job 时,我们需要设定partition 和combination 的策略。
Lookup DataSet 与Lookup StageParallel Job 对lookup 的实现做了一些调整,在Server Job 中,我们一般是用Transformer Stage 配合lookup 数据源(一般是hash 文件)来实现lookup,同一个transformer 中可以同时完成多个lookup,类似于sql 中的多表自然联接,如果lookup 数据源使用的是database stage 而不是hash file 而且对于一条记录返回多条lookup data 的话,job 会产生warning(hash file 的键唯一特性使得它不会存在这个问题,后面插入的重复数据会覆盖前面的同主键的数据)。
而在Parallel Job 中,lookup 需要用一个单独的stage 来实现,transformer 不再兼职lookup 的“副业”,在一个lookup stage 中,可以有一个主数据link 和多个lookup link。
同时,Parallel 中的lookup 还有以下的新特性•支持multi rows,在一个lookup stage 中对于一行主输入数据可以有一个lookup link 返回多于一行的lookup 数据。
结果也会变成多行。
•Parallel 中不在支持hash file,转而使用封装更强的Data Set stage, Data Set 本质上也是hash 数据结构,但对Job 开发人员隐藏了实现细节,我们不用象开发Server Job 那样去手动设定详细参数•Parallel 中除了支持等值lookup 外,还直接支持Range lookup 和Caseless lookup。
这样我们在完成类似月份转换为季度性质的设计时就会非常的方便和自然。
类似于Server Job 中的hash 文件,在Parallel Job 中我们使用Data Set 文件来缓存lookup 数据,并加载到内存中,在Data Set stage 中,我们只需要制定记录的主键和存储的文件名,Parallel 引擎会为我们处理其他的操作。
但为了达到性能的最优化,我们有时需要制定Data Set 的缓存策略和缓存大小,系统默认的缓存大小是3M,如果我们的lookup 数据比较大,就需要设定合适的缓存大小,否则会严重影响lookup 的性能。
图 6. DataSet 缓存设置点击查看大图Sort StageParallel Sort stage 的行为类似于Sql 中的order by,但是比order by 提供了更多的选项。
在job 中,Sort stage 接收一个输入link 并产生一个输出link。
对于写过sql order by 或者排序程序的开发人员使用Sort Stage 的基本功能应该是很简单的,但是要充分发挥Parallel stage 的强大功能,我们还是需要注意下面几点:•并行还是串行执行,如果选择串行执行,那么Sort stage 的行为就类似于Server Job 中的Sort Stage,整个输入数据都会按照设定的排序选项排序,但如果选择分区/ 并行排序,则只有每个分区内的输出是有序的,这在有些情况下是可以接受的,但在另外一些情况下会导致代码缺陷,需要根据sort 的后续操作做出选择。
•如果有可能,尽量在数据源端的数据库中进行排序,这样不但会提高数据排序的效率,还能大大减少job 对内存,I/O 的压力。