源码分析第三讲–Kettle 转换机制transformation介绍3

Posted on Posted in kettle基础概念

4. Trans执行

  trans类的执行有execute()负责,主要包含两个步骤:转换执行前的准备工作和所有线程的开启。Trans每一个步骤都会对应一个独立的线程,线程之间公国RowSet进行通信交互。

代码 Trans执行代码

复制代码

1   public void execute(String[] arguments) throws KettleException {2 3        prepareExecution(arguments);4 5        startThreads();6 7 }

复制代码

4.1.    执行准备(prepareExecution)

该步骤,主要完成对通信类的初始化,对步骤的包装初始化。最后启动各个步骤初始化线程,即调用各个步骤的init()方法。准备结束之后,步骤之间的通信机制完成了,各个步骤的初始化工作也完成了。具体的流程如下所示:

 

图 13 准备执行流程图

1.4.2.    转换处理执行

Trans转换执行引擎类,通过startThreads()启动步骤线程。为所有步骤添加监听器,在开启监听进程对所有线程进行监听。具体的步骤如下所示

 

图 14 启动所有步骤线程

1.4.3.    步骤执行过程

  实现StepInterface的不同的step各个功能个不一样,但是它们之间也有一定的规律性。下图只列举了两个step,(TextInput)文本输入和Uniquerow(去重)。BaseStep封装了getRow()和putRow()方法,从上一个步骤获取数据和将数据输入到下一个步骤。

  基类BaseStep采取了统一的处理方式,调用子类processRow以行为单位处理,核心代码如下。

  while (stepInterface.processRow(meta, data)&& !stepInterface.isStopped());

  processRow( )通用过程是:调用基类BaseStep 的getRow( )得到数据,对一行数据处理,处理之后调用基类putRow( )方法数据保存至outputRowSets(即next step的inputRowSets)

 

 

图 15 TextInput与Uniquerow

1.4.4.    元数据与数据关系。

  Trans中的ETL过程(每个step)以行为单位处理,其中行的元数据信息RowMeta和数据信息统一保存在RowSet对象中。

  在RowSet中RowMeta的成员的调试结果如下。可见rowMeta储存了每列数据的名称和类型。第一列列名flag,数据是长度为1的String;第二列列名id…

 

RowSet的数据信息在queArray队列中,调试结果如下:可以看出第一个数据元素是一个Object包含了3列,数据内容为(N,1,a…)

 

https://www.cnblogs.com/wukenaihe/p/3215790.html