kettle转换之多线程,kettle多线程
kettle转换之多线程
ETL项目中性能方面的考虑通常是最重要的,特别是所讨论的任务频繁执行,或一些列的任务必须在固定的时间内执行。本文重点介绍利用kettle转换的多线程特性,以优化其性能。
假设转换中的每个步骤已经设置成最快的执行速度并且调节性能至最佳,且再没有更多的性能提升空间。但是利用kettle的多线程特性仍然可能提升转换的整体性能。
调整队列大小
当尝试优化性能时,你可以调整输入、输出队列的大小。特别是如果你有足够多的内存(RAM)可用。在kettle转换中配置队列大小是转换配置中的“Nr of rows in rows”选项的大小,其配置对转换中所有的步骤都有效。增加可使转换更快执行完活动的步骤,从而释放CPU时间给后续步骤。针对特定转换调节合适大小最佳实践。
设置步骤执行拷贝数
kettle转换在运行时,每个步骤可被看成一个带着输入、输出行队列的工作线程,每个线程是并行运行的,当数据化是有效时即处理。kettle允许针对每个独立步骤手工定义其线程数。如果转换有一个瓶颈步骤,该步骤有多个实例同时运行可以加快处理速度。可以通过检查每个步骤的输入、输出队列及行/秒的处理性能找到候选的瓶颈步骤。如果某步骤有满输入队列,空输出队列,并每秒处理行数低,这些因素往往决定了整个转换的性能,从而找到瓶颈步骤。这些因素的数据在kettle执行“Step Metrics”视图中可以看到。
右击问题步骤,选择“change number ofcopies to start..”并输入合适的线程数,这时当你运行转换时,你将注意到多个运行的实例,每个实例在视图中有自己的输入、输出队列。
转换的整体性能提升取决于每个步骤的性能及操作系统和硬件性能。如:如果cpu性能强,“计算”步骤性能就佳;数据库查询步骤可以通过多线程提升性能;其他步骤如”update“步骤不太可能提升性能,但是和RDBMS有很多关系。
需要注意的是步骤启用多线程也有它的局限性。更具体地,如果问题的步骤中或之后,依赖所有数据行的排列顺序时,该转换将不能正确的运行。每个步骤的多个线程都独立地接收并处理他们的数据行,因此不能保证所有数据行驶按顺序处理。另外需要提醒的是,每个线程保持自己的独立内部状态,并不能看到其他线程正处理的行。因此,如果某个步骤必须看到所有的行,才能正常工作,那一定不能使用多线程。”Sort rows”, “Unique rows” 和 “Rowdenormalizer”就是最好的例子。这这些步骤使用多线程是没有意义的,因为每个线程处理行仅仅是所有行的一个子集。
结论
kettle允许转换中的每个单独定义多个线程执行,同时可以也设置输入、输出队列大小,两个特性对提升执行速度非常有用。针对单个步骤启动多线程,两点事实需要考虑的是,每个线程不能看到整个数据行,且每个线程处理行顺序不确定。
1. 变量的类型Kettle 的早期版本中的变量只有系统环境变量目前版本中(3.1) 变量包括系统环境变量, Kettle变量 和内部变量三种系统环境变量的影响范围很广,凡是在一个 JVM下运行的线程都受其影响.Kettle 变量限制了变量的作用范围, 变量范围包括三种分别是 grand-parent job, parent job, root job内部变量: 是 kettle 内置的一些变量, 主要是kettle 运行时依赖的环境, 如转换文件名称, 转换路径,ip地址, kettle 版本号等等.2. 变量的设置系统环境变量 有三种设置方式1) 通过命令行 -D 参数2) 属性文件 kettle.property 中设置, 该属性文件位于 ${user.home}.kettle 下3) 通过设置环境变量步骤 (Set Variable) 设置.Kettle 变量 只能通过设置环境变量 (Set Variable) 步骤设置,同时设置变量的作用范围.内部变量 是预置的无须设置.3. 变量的使用无论哪种类型的变量在使用上都是一样的, 有两种方式1) 通过 %%var%% 或 ${var} 来引用, 这个引用可以用在 SQL 语句中, 也可以用在允许变量输入的输入框里.2) 通过获取变量 (Get Variable) 步骤来使用命令行参数:1. 设置: 命令行参数通过获取系统信息(Get System Info) 步骤设置, 在使用时可以像列名一样来使用,不必像变量一样要通过 ${var} 这样的格式引用. 用户最多可以设置10个命令行参数2. 传递: 命令行下使用 pan /file:xxx.ktr arg1 arg2 来传递参数.图形界面下,每次运行时有要求输入参数的提示窗口.
在通用组件中,将【Transformation】拖拽至配置界面,然后双击指定需要运行的转换。