Kettle 中转换的执行过程,源码分析
kettle中trans执行流程、以及具体step流程源码分析。
基础概念
每个转换步骤都是ETL数据流里面的一个任务。转换步骤包括输入、处理和输出。输入步骤从外部数据源获取数据,例如文件或者数据库;处理步骤处理数据流,字段计算,流处理等,例如整合或者过滤。输出步骤将数据写会到存储系统里面,例如文件或者数据库。
转换相关类
Trans类
public class Trans implements VariableSpace, NamedParams, HasLogChannelInterface, LoggingObjectInterface,
ExecutorInterface, ExtensionDataInterface {
此类表示与转换概念相关联的信息和操作。它装载,实例化、初始化、运行和监视指定的
Transinfo对象。
StepInterface继承体系
实现StepInterface接口的类,在转换运行时,将是数据实际处理的位置。每个执行线程都表示一个实现StepInterface的实例。
-
BaseStep实现了StepInterface是各step具体实现类的基类。完成了公用的处理函数,如putRow(),但是对于更具体的processRow()在StepBase的子类中。StepBase的主要成员有
public ArrayList inputRowSets,outputRowSets;StepBase的子类每次从inputRowSets中取出一行数据,向outputRowSets中写入一行数据。
StepDataInterface继承体系
public class TableInputData extends BaseStepData implements StepDataInterface {
实现StepDataInterface接口的类为数据类,当插件执行时,对于每个执行执行的线程都是唯一的。保存于step相关的数据信息,比如行的元数据信息。
通常,StepDataInterface实现类将包含结果集、临时数据、缓存索引等。
BaseStepData
abstract class BaseStepData implements StepDataInterface
抽象基类BaseStepData 主要有一个step执行状态的内部枚举类。
enum StepExecutionStatus
TableInputData举例
public class TableInputData extends BaseStepData implements StepDataInterface {
public Object[] nextrow;
public Object[] thisrow;
public Database db;
public ResultSet rs;
public String lookupStep;
public RowMetaInterface rowMeta;
public RowSet rowSet;
public boolean isCanceled;
public StreamInterface infoStream;
插件使用TableInputData data内部变量,一般主要有以下内容:
- 处理行元信息(字段信息)
一般在插件首次运行时,定义
Object[] parameters;
RowMetaInterface parametersMeta;
然后初始化
parameters = new Object[] {};
parametersMeta = new RowMeta();
然后查库,赋值这两个内部变量。
根据数据库查询的字段信息,赋值给 data.rowMeta
// Keep the metadata
data.rowMeta = data.db.getReturnRowMeta();
// Set the origin on the row metadata...
if ( data.rowMeta != null ) {
for ( ValueMetaInterface valueMeta : data.rowMeta.getValueMetaList() ) {
valueMeta.setOrigin( getStepname() );
}
}
- 处理具体记录信息
每一行数据存储为一个Object[] 的对象数组。
tableInput 输入插件,在第一次进来时,先查库,一次性读到结果集中ResultSet rs,
然后赋值当前行 thisrow,和下一行 nextrow
// Get the first row...
data.thisrow = data.db.getRow( data.rs );
if ( data.thisrow != null ) {
incrementLinesInput();
data.nextrow = data.db.getRow( data.rs );
if ( data.nextrow != null ) {
incrementLinesInput();
}
}
StepMetaInterface继承体系
public class TableI