1.1. 相关的类和接口

1.1.1. JobEntryTrans

实现了JobEntryInterface的execute()方法,被job运行。由JobEntryTrans实例化Trans,并运行。

1.1.2. TransGraph

当点击trans面板的run时。由TransGraph实例化Trans。并运行。

Trans主要成员有:

private TransMeta transMeta;

private Repository repository;

private Job parentJob;

private Trans parentTrans;

private List<RowSet> rowsets;

private List<StepMetaDataCombi> steps

当中最重要的是rowsets、steps。

rowsets保存了全部hop相应的行元数据和数据信息。

List<StepMetaDataCombi> steps封装了一个step的主要内容。

1.1.3. TransMeta

描写叙述了整个Trans的元数据信息。 基本的属性成员有:

private List<StepMeta>           steps;

private List<TransHopMeta>       hops;

private String              name;

private Result            previousResult;上一个jobentry的运行结果。

private List<RowMetaAndData> resultRows;这次trans运行后的数据结果。

private List<ResultFile>     resultFiles;

resultRows成员将作为result比部分返回多行的元数据和数据(假设有的话)须要返回数据结果时。

把resultRows增加Result结果的rows列表,并返回。

1.1.4. StepMetaDataCombi

提取了一个step所需的主要信息。

public class StepMetaDataCombi

{

public StepMeta stepMeta;

public String stepname;

public int    copy;

public StepInterface     step;

public StepMetaInterface meta;

public StepDataInterface data;

}

1.1.5. TransHopMeta

描写叙述hop信息。

1.1.6. StepMeta

描写叙述step的公有基本信息(stepid,stepname),对于每个详细的step。由成员变量StepMetaInterface step来描写叙述。

1.1.7. StepInterface

主要成员函数:

processRow()对一行的数据处理。

putRow()把处理后的数据放入下一个step的inputrowsets中。

1.1.8. StepBase

实现了StepInterface是各step详细实现类的基类。完毕了公用的处理函数。如putRow()。可是对于更详细的processRow()在StepBase的子类中。StepBase的主要成员有

public ArrayList<RowSet>  inputRowSets。outputRowSets;

StepBase的子类每次从inputRowSets中取出一行数据,向outputRowSets中写入一行数据。

1.1.9. StepDataInterface

与step相关的数据信息。比方行的元数据信息。StepMetaInterface的实现类是与详细step相关的元数据信息,与StepMeta配合使用。共同描写叙述详细step的元数据信息。

1.1.10. RowSet

RowSet类中包括源step。目标step和由源向目标发送的一个rowMeta和一组data。当中data数据是以行为单位的队列(queArray)。一个RowSet作为此源step的outputrowsets的一部分。

同一时候作为目标step的inputRowsets一部分。源Step每次向队列中写一行数据。目标step每次从队列中读取一行数据。

1.1.11. RowMetaAndData

public class RowMetaAndData implements Cloneable{

private RowMetaInterface rowMeta;//行的元数据,描写叙述了每行的数据名字,数据类型。

private Object[]         data;//数据

}

1.2. 运行过程概述

Trans的运行机制是搭建一个结构,使得每个step可以从自己的inputRowsets读。处理一行,将结果输出到自己的outputRowsets中。

注意:一个rowset对象既属于前一个step成员outputRowsets的一部分,也属于后一个对象的inputRowsets的一部分。全部的rowset信息都在Trans对象中以List形式维护。

1.3. Trans运行过程时序图

因为trans能够有TransGraph实例化。也能够由JobEntryTrans实例化。

但基本过程是一样的,先实例化TransMeta,再实例化Trans,终于调用trans的start方法。

由TransGraph实例化例如以下图所看到的:

由JobEntryTrans实例化,例如以下图所看到的:

1.4. Trans代码解释

1.4.1. JobEntryTrans类execute( )

首先获取元数据。然后以此作为參数实例化trans

TransMeta transMeta = getTransMeta(rep);

……

Trans trans = new Trans(transMeta);

……

trans.execute(args);

1.4.2. Trans类execute( )

详细运行前须要进行准备工作

public void execute(String[] arguments) throws KettleException{

prepareExecution(arguments);

startThreads();

}

1.4.3. Trans的prepareExecution()

搭建下面结构结构。

(1)、对每个step依据hop信息进行找到下一个step或多个step。

(2)、对于每个this step和nex tstep生成一个RowSet对象,作为缓存供this step写,同一时候供next step读取数据。

(3)、把此RowSet对象增加到Trans的List<RowSet>成员中保存。

List<StepMeta> hopsteps=transMeta.getTransHopSteps(false);

得到step列表

……

对每个step进行例如以下设置

for (int i=0;i<hopsteps.size();i++)

{

StepMeta thisStep=hopsteps.get(i);

……

//找到下一个step的列表

List<StepMeta> nextSteps = transMeta.findNextSteps(thisStep);

int nrTargets = nextSteps.size();

for (int n=0;n<nrTargets;n++)

{

StepMeta nextStep = nextSteps.get(n);

…… 对于每个hop信息生成RowSet,并设置RowSet。把

int thisCopies = thisStep.getCopies(); 处理源step的次数

int nextCopies = nextStep.getCopies(); 处理目标step的次数

for (int c=0;c<nrCopies;c++)     nrCopies   依据 上面的thiscopies和nextcopies得到

    {

    RowSet rowSet;    //定义rowset  用来存放元数据   对于每个hop信息生成RowSet,并设置RowSet



    switch(transMeta.getTransformationType()) {

    case Normal:

     // This is a temporary patch until the batching rowset has proven to be working in all situations.

     // Currently there are stalling problems when dealing with small amounts of rows.

     //

     Boolean batchingRowSet = ValueMeta.convertStringToBoolean(System.getProperty(Const.KETTLE_BATCHING_ROWSET));

     if (batchingRowSet!=null && batchingRowSet.booleanValue()) {

       rowSet = new BlockingBatchingRowSet(transMeta.getSizeRowset());    
   

     } else {

       rowSet = new BlockingRowSet(transMeta.getSizeRowset());

     }

     break;

     

    case SerialSingleThreaded: 

     rowSet = new SingleRowRowSet(); 

     break;

     

              case SingleThreaded: 

                rowSet = new QueueRowSet(); 

                break;

       .................

rowsets.add(rowSet);                  
最后的得到rowset

}

}

……

(4)、依据TransMeta的step信息生成对应的StepMetaDataCombi(即steps)信息,加到steps列表中。

StepMetaDataCombi combi = new StepMetaDataCombi();

combi.stepname = stepMeta.getName();

combi.copy     = c;

combi.stepMeta = stepMeta;

combi.meta = stepMeta.getStepMetaInterface();

StepDataInterface data = combi.meta.getStepData();

combi.data = data;

……

StepInterface step=combi.meta.getStep(stepMeta, data, c, transMeta, this);

在step初始化时,会把Trans中的List<RowSet>的对应的rowset增加到step的inputRowSets,和outputRowSets中。

combi.step = step;

steps.add(combi);

1.4.4. Trans类startThreads( )

打开了全部的step线程,核心代码例如以下:

for (int i=0;i<steps.size();i++){

steps.get(i).step.start();

}

1.5. Step运行

实现StepInterface的不同的step各个功能个不一样。可是它们之间也有一定的规律性。下图仅仅列举了两个step,(TextInput)文本输入和Uniquerow(去重)。

1.5.1. 启动

每个详细的step启动线程时。自己主动调用run函数,它们统一调用基类的静态方法

public void run(){

BaseStep.runStepThread(this, meta, data);

}

1.5.2. 处理

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

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

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

1.5.3. 元数据与数据关系。

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

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

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

版权声明:本文博主原创文章。博客,未经同意不得转载。

kettle 4.4源代码分析Transformation的更多相关文章

  1. Spark SQL Catalyst源代码分析之TreeNode Library

    /** Spark SQL源代码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心执行流程.SqlParser,和Analyzer,本来打算直接写Optimizer的,可是发 ...

  2. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

  3. Twitter Storm源代码分析之ZooKeeper中的目录结构

    徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...

  4. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  5. 转:RTMPDump源代码分析

    0: 主要函数调用分析 rtmpdump 是一个用来处理 RTMP 流媒体的开源工具包,支持 rtmp://, rtmpt://, rtmpe://, rtmpte://, and rtmps://. ...

  6. 转:ffdshow 源代码分析

    ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远 ...

  7. UiAutomator源代码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源代码分析之启动和执行>我们描写叙述了uitautomator从命令行执行到载入測试用例执行測试的整个流程.过程中我们也描写叙述了UiAutomatorB ...

  8. MyBatis架构设计及源代码分析系列(一):MyBatis架构

    如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处. 一.概述 MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己 The MyBa ...

  9. hostapd源代码分析(三):管理帧的收发和处理

    hostapd源代码分析(三):管理帧的收发和处理 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004379 这篇文章我来讲解一下h ...

随机推荐

  1. Java流的理解

    最近做了一下Socket编程,其中有socket.getInputStream和socket.getOutputStream的问题. 想传输文件,感觉应该用FileInputStream和FileOu ...

  2. wp天气预报

    ak url  http://developer.baidu.com/map/index.php?title=car 后台cs using System; using System.Collectio ...

  3. poj 3172 Scales 搜索

    其实这个题目要是注意到了题目的一点关键性的描述就会变得很简单,题意是给出的砝码是至少是前两个的和的,有了这一点,那么砝码的数量应该就在几十左右,这样的话适当剪枝的搜索是应该可以过的. #include ...

  4. Git管理工具对照(GitBash、EGit、SourceTree)

    Git管理工具对照(GitBash.EGit.SourceTree) GitBash是採用命令行的方式对版本号进行管理,功能最为灵活强大,可是由于须要手动输入希望改动的文件名称,所以相对繁琐. EGi ...

  5. 【cocos2d-x制作别踩白块儿】第一期:游戏介绍

    这一系类文章.我们将来分析时下最火的一款游戏 -- 别踩白块儿. 无图无真相,先上图 这就是我们终于要完毕项目的效果图. 游戏刚開始的最以下有一栏为黄色,紧接着上面每一行都是有一个黑色块,其余为白色块 ...

  6. cocos2d-x环境搭建(win7+cocos2d-x-3.0)

    一.环境需准备的材料: 1.VS2012,下载地址:官网 2.cocos2d-x和cocostudio,下载地址:官网 3.eclispe,我用的是:adt-bundle-windows-x86_64 ...

  7. session校验是否登录

    由于一个网站要有好多页面,如果每个页面都写上检验session是否为空,太麻烦了,所以写个工具类,就方便了. 1首先创建一个类库Common 2,然后在这个类库添加引用 3在Common继承 :Sys ...

  8. Android在 Alertdialog对话框中点击消失?

    在开发的时候遇到一个问题.就是一触摸对话框边缘外部,对话框会自己主动消失.这个问题非常纠结啊,查找了一下发现从Android 4.0開始.AlertDialog有了变化.就是在触摸对话框边缘外部.对话 ...

  9. .NET垃圾回收笔记

    名词 垃圾收集目标 ephemeral GC 发生在Gen 0 和Gen 1 的垃圾收集 Full GC 发生Gen 2 及以上的Gen与LOH的垃圾收集 垃圾收集模式 工作站模式 GC直接发生在内存 ...

  10. Blink: Chromium的新渲染引擎

    编自http://www.chromium.org/blink 关于blink Google Chrome/Chromium 从创始至今一直使用 WebKit(WebCore) 作为 HTML/CSS ...