Kettle核心概念

  • 可视化编程 Kettle可以被归类为可视化编程语言,因为Kettle可以使用图形化的方式定义复杂的ETL程序和工作流。可视化编程一直是Kettle里的核心概念,它可以让你快速构建复杂的ETL作业和减低维护工作量。隐藏很多技术细节。 Kettle里的代码就是转换和作业。
  • 转换 转换(transaformation)负责数据的输入、转换、校验和输出等工作。Kettle中使用转换完成数据ETL全部工作。转换由多个步骤(Step)组成,如文本文件输入,过滤输出行,执行SQL脚本等。各个步骤使用跳(Hop)来链接。跳定义了一个数据流通道,即数据由一个步骤流(跳)向下一个步骤。在Kettle中数据的最小单位是数据行(row),数据流中流动其实是缓存的行集(RowSet)。
  • 步骤

步骤(控件)是转换里的基本的组成部分。 一个步骤有如下几个关键特性:

  1. 1. 步骤需要有一个名字,这个名字在同一个转换范围内唯一。
  2. 2. 每个步骤都会读、写数据行(唯一例外是“生成记录”步骤,该步骤只写数据)。
  3. 3. 步骤将数据写到与之相连的一个或多个输出跳(hop),再传送到跳的另一端的步骤。
  4. 4. 大多数的步骤都可以有多个输出跳。一个步骤的数据发送可以被设置为分发和复制。
  • 分发和复制

    1. 1. 分发是目标步骤轮流接收记录。
    2. 2. 复制是所有的记录被同时发送到所有的目标步骤。

跳就是步骤之间带箭头的连线,跳定义了步骤之间的数据通路。 按住键盘SHIFT键,并且点击鼠标左键将两个控件链接起来,链接时选择“主输出步骤”。

  1. * 转换跳
  2. 转换跳实际上是两个步骤之间的被称之为行集的数据行缓存,行集的大小可以在转换的设置里定义,默认是10000行。当行集满了,向行集写数据的步骤将停止写入,直到行集里又有了空间。当行集空了,从行集读取数据的步骤停止读取,直到行集里又有可读的数据行。
  3. * 作业跳
  4. 作业的跳是作业项之间的连接线,他定义了作业的执行路径。作业里每个作业项的不同运行结果决定了做作业的不同执行路径。作业跳一共分为下面三种情况:
  5. 1. 无条件执行:不论上一个作业项执行成功还是失败,下一个作业项都会执行。这是一种蓝色的连接线,上面有一个锁的图标。
  6. 2. 当运行结果为真时执行:当上一个作业项的执行结果为真时,执行下一个作业项。通常在需要无错误执行的情况下使用。这是一种绿色的连接线,上面有一个对钩号的图标。
  7. 3. 当运行结果为假时执行:当上一个作业项的执行结果为假或者没有成功执行是,执行下一个作业项。这是一种红色的连接线,上面有一个红色的停止图标。

在图标上单击就可以对跳进行设置。

  • 元数据

每个步骤在输出数据行时都有对字段的描述,这种描述就是数据行的元数据。 通常包含下面一些信息。

  1. 1. 名称:数据行里的字段名是唯一的。
  2. 2. 数据类型:字段的数据类型。
  3. 3. 格式:数据显示的方式,如Integer的#、0.00
  4. 4. 长度:字符串的长度或者BigNumber类型的长度。
  5. 5. 精度:BigNumber数据类型的十进制精度。
  6. 6. 货币符号:¥。
  7. 7. 小数点符号:十进制数据的小数点格式。不同文化背景下小数点符号是不同的,一般是点(.)或逗号(,)。
  8. 8. 分组符号:数值类型数据的分组符号,不同文化背景下数字里的分组符号也是不同的,一般是点(.)或逗号(,)或单引号(’)。
  • 数据类型 数据以数据行的形式沿着步骤移动。一个数据行是零到多个字段的集合,字段包含下面几种数据类型。
    1. String:字符类型数据
    2. Number:双精度浮点数。
    3. Integer:带符号长整型(64位)。
    4. BigNumber:任意精度数据。
    5. Date:带毫秒精度的日期时间值。
    6. Boolean:取值为true和false的布尔值。
    7. Binary:二进制字段可以包含图像、声音、视频及其他类型的二进制数据。

作业

作业 (Job),负责定义一个完成整个工作流的控制,比如将转换的结果发送邮件给相关人员。因为转换(transformation)以并行方式执行,所以必须存在一个串行的调度工具来执行转换,这就是Kettle中的作业。

  • 并行

跳的这种基于行集缓存的规则允许每个步骤都是由一个独立的线程运行,这样并发程度最高。这一规则也允许数据以最小消耗内存的数据流的方式来处理。 对于kettle的转换,不能定义一个执行顺序,因为所有步骤都以并发方式执行:当转换启动后,所有步骤都同时启动,从它们的输入跳中读取数据,并把处理过的数据写到输出跳,直到输入跳里不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了。 如果你想要一个任务沿着指定的顺序执行,那么就要使用下面所讲的“作业”!

  • 变量

在转换或作业运行时,可以自定义变量传递到转换或作业中,运行时使用。在各种组件中,带有$符号输入都可以使用变量传递。 使用方式:${变量名}

  • 事务

    1. 1. 一个作业内的转换,是顺序执行的。
    2. 2. 一个转换内的步骤是并行执行的。
    3. 3. 作业内不支持事务,转换内支持事务
  • 转换与作业不同点

    1. 1. 转换步骤与步骤之间是数据流,作业项之间是步骤流。
    2. 2. 转换启动以后,所有步骤一起并行启动等待数据行的输入,而作业项是严格按照执行顺序启动,一个作业项执行完以后,再执行下一个作业项。
    3. 3. 在作业项之间可以传递一个结果对象(result object)。这个结果对象里面包含了数据行,它们不是以数据流的方式来传递的。而是等待一个作业项执行完了,再传递个下一个作业项。
    4. 4. 因为作业顺序执行作业项,所以必须定义一个起点。有一个叫“开始”的作业项就定义了这个点。一个作业只能定一个开始作业项。

kettle参数详解

Kettle支持3种参数:位置参数、命名参数、变量。位置参数(argument) 根据参数的位置来设置和读取参数值,用于在作业/转换外部传入,并在KJB内部使用 注意 1、参数值只能由外部传入(arg1 arg2 arg3)2、通过位置来取值; 3、只能在转换中(transform)获取到参数值; 4、最多支持10个参数 5、功能:太弱(不建议使用)

如何设置及使用

  1. 在设计界面(spoon.bat)点击执行按钮时,可以在弹出的“Run Options”设置,每次运行都要重新设置;
  2. 在命令行界面(kitchen.bat)执行.kjb文件时,直接指定。如:sh kitchen.sh -file=/kettle/test.kjb 20150101 abc 123,这里按顺序指定了3个参数,以空格隔开;
  3. 父作业里面执行一个子作业时,可以在“Job”控件的Arguments标签里指定,可以使用变量
  4. 新建一个转换,选择“Input”下的“get System Info”控件,type选择“command line argument1、2、3…”,即可读取对应位置的参数值。
  • 命名参数(parameter) 根据参数的名字来设置和读取参数值,用于在作业/转换外部传入,并在KJB内部使用 注意:
  1. 参数值只能由外部传入(-param:Key=Value),Key必须固定,值可以在KJB内部重新赋值;
  2. 可以在作业属性中指定默认值,如果外部不传入,就取默认值;
  3. 可在作业、转换中任意使用;
  4. 不能动态新增;
  5. 通过${Key}使用;
  6. 强大程度:一般 如何设置及使用 双击作业(或转换)的空白处,在弹出的“parameters”标签页,可以设置参数的名字。
  7. 在设计界面(spoon.bat)点击执行按钮时,可以在弹出的“Run Options”设置,每次运行都要重新设置;
  8. 在命令行kitchen.bat执行.kjb文件时,直接指定。如:sh kitchen.sh -file=/kettle/test.kjb -param:P1=20150101 -param:P2=abc -param:P3=123,这里指定了三个命名参数P1、P2、P3的参数值,顺序不限 3、父作业里面执行一个子作业时,可以在“Job”控件的Parameters标签里指定,可以使用变量,可以使用数据流批量赋值并循环
  9. 在所有控件中,末尾带有菱形$号的输入框都可以使用,通过${KEY_NAME}使用。可以嵌套使用,比如${P1}的内容是ABC${P2}123,那么${P2}的值也会被替代成真实值
  10. 通过作业里面的JavaScript脚本控件读取,如:parent_job.getVariable(“VAR1”);变量(variable) 由用户自定义,在作业/转换内部随时随地的定义、赋值和使用

注意:

  1. 变量必须在KJB内部定义,在内部赋值,在内部使用(Key=Value);
  2. 虽然变量只能在内部定义、赋值和使用,但是因为Key和Value都可以是变量,所以可以从外部(文件、数据库等)读取变量名、变量值,实现动态的变量声明、赋值,功能非常强大;
  3. 可在作业、转换任意使用;
  4. 可以动态声明、赋值、使用;
  5. 通过${Key}使用;
  6. 最灵活强大,推荐使用

如何设置及使用

  1. 在作业中,通过General->Set Variables控件定义;
  2. 在转换中,通过Job->Set Variables控件定义;
  3. 在作业中,通过“JS脚本”控件设置,如parent_job.setVariable(“VAR1”, “abc123”);
  4. 在作业中,通过General->Set Variables控件赋值;
  5. 在转换中,通过Job->Set Variables控件赋值,前面必须带有一个Input控件(强大的关键点在这里,Input控件有多少,我们就可以有多少种方法去动态设置变量),且Input控件生成的记录数必须是1条(也可以是0,此时变量未能赋值);
  6. 在作业中,通过“JS脚本”控件设置,如parent_job.setVariable(“VAR1”, “abc123”);
  7. 父作业里面执行一个子作业时,子作业可以自由使用父作业定义的变量,包括重新赋值,不用刻意传递
  8. 在所有控件中,末尾带有菱形$号的输入框都可以使用,通过${KEY_NAME}使用。可以嵌套使用,比如${P1}的内容是ABC${P2}123,那么${P2}的值也会被替代成真实值;
  9. 通过作业里面的JavaScript脚本控件读取,如:parent_job.getVariable(“VAR1”);