Kettle多线程导致的抽取问题解决

Kettle多线程导致的抽取问题解决
Kettle多线程导致的抽取问题解决

今天在测试kettle一个转换的问题,据现场描述,在手工执行该job转换时,获取到的时间是正确的,但是一旦使用批处理计划任务调用执行时,获取到的时间就有问题,转换如下:

'查找数据库当前时间' 这个步骤的数据库连接是’AA‘,这一步骤的动作是查找当前系统时间

select sysdate as cksj from dual

’插入/更新‘的数据库连接是’BB‘,这一步骤的动作是把上一步骤得到的时间,更新到表tt的bcgxsj字段中

’删除'的数据库连接是‘BB’,这一步骤的动作是删除表t1中CQZT='1'的数据

‘获取更新时间’的数据库连接是'BB',这一步骤是获取步骤‘插入/更新’中更新表tt的bcgxsj字段后的值

现在出现的问题就是,在单独执行时,发现‘获取更新时间’步骤中,获取到的时间,确实是‘插入/更新’步骤执行后的值,

但是,如果通过bat调用,在计划任务中执行时,发现‘获取更新时间’步骤中,获取到的bcgxsj就不对了,查看日志,发现获取到的时间,是更新前的时间。

猜想,应该是kettle多线程的问题。再仔细看日志,发现执行的步骤好像有点不对

发现‘获取更新时间’这一步骤根本不是在’插入/更新‘后执行的,而是一开始就已经连接数据库查询,这样肯定出来的结果不可能是更新后的当前系统时间

这步骤甚至比’查找数据库当前时间‘更早执行。

网上查找原因:

在多线程软件下处理数据库连接,最推荐的方法是在转换执行的过程中为每个线程创建单一的连接。因此,每个步骤复制都打开它们自己单独的事务或者事务集。

这将导致一个潜在的后果,就是你在使用同一个数据库资源的场景下,例如一张数据表或者视图,条件竞争在同一个转换中可能而且会经常发生。

一个常见产生错误的场景,就是当你往一个关系数据表里面写入数据,在随后的步骤里面读回。因为这两个步骤运行在不同的数据库连接下,而且拥有不同的事务上下文,你不能确保这个被第一个步骤写入的数据将可见于其他正在执行读操作的步骤。

一个常见,且简单的解决这个问题的方案就是将这个转换分成2个不同的转换,然后保存数据在临时表或者文件中。

另外一个方案是强制使所有的步骤使用单一数据库连接(仅一个事务),启用转换设置对话框中的“Make the transformation database transactional”选项即可,(这一个我暂时找不到在哪)。

分析我上面转换获取错误时间的原因,

由于‘获取更新时间’ 和'查找数据库当前时间' 这两个步骤,是不同的数据库连接下,所以没办法保证这两个查询的先后顺序。像日志所述,反而是‘获取更新时间’先执行。

解决办法:

把这两个查询分成两个不同的转换

转换1

转换2

然后建一个job,把这两个转换串行起来

再测试,查看日志,发现时间获取正确

KETTLE组件介绍与使用

KETTLE组件介绍与使用 4.1 Kettle使用 Kettle提供了资源库的方式来整合所有的工作,; 1)创建一个新的transformation,点击保存到本地路径,例如保存到D:/etltest下,保存文件名为Trans,kettle默认transformation文件保存后后缀名为ktr; 2)创建一个新的job,点击保存到本地路径,例如保存到D:/etltest下,保存文件名为Job,kettle默认job文件保存后后缀名为kjb; 4.2 组件树介绍 4.2.1Transformation 的主对象树和核心对象分别如下图:

Transformation中的节点介绍如下: Main Tree:菜单列出的是一个transformation中基本的属性,可以通过各个节点来查看。DB连接:显示当前transformation中的数据库连接,每一个transformation的数据库连接都需要单独配置。 Steps:一个transformation中应用到的环节列表 Hops:一个transformation中应用到的节点连接列表 核心对象菜单列出的是transformation中可以调用的环节列表,可以通过鼠标拖动的方式对环节进行添加: Input:输入环节 Output:输出环节 Lookup:查询环节 Transform:转化环节 Joins:连接环节 Scripting:脚本环节 4.2.2 Job 的主对象树和核心对象分别如下图: Main Tree菜单列出的是一个Job中基本的属性,可以通过各个节点来查看。 DB连接:显示当前Job中的数据库连接,每一个Job的数据库连接都需要单独配置。 Job entries/作业项目:一个Job中引用的环节列表 核心对象菜单列出的是Job中可以调用的环节列表,可以通过鼠标拖动的方式对环节进行添加。 每一个环节可以通过鼠标拖动来将环节添加到主窗口中。 并可通过shift+鼠标拖动,实现环节之间的连接。

Kettle多线程导致的抽取问题解决

今天在测试kettle一个转换的问题,据现场描述,在手工执行该job转换时,获取到的时间是正确的,但是一旦使用批处理计划任务调用执行时,获取到的时间就有问题,转换如下: '查找数据库当前时间' 这个步骤的数据库连接是’AA‘,这一步骤的动作是查找当前系统时间 select sysdate as cksj from dual ’插入/更新‘的数据库连接是’BB‘,这一步骤的动作是把上一步骤得到的时间,更新到表tt的bcgxsj字段中 ’删除'的数据库连接是‘BB’,这一步骤的动作是删除表t1中CQZT='1'的数据 ‘获取更新时间’的数据库连接是'BB',这一步骤是获取步骤‘插入/更新’中更新表tt的bcgxsj字段后的值 现在出现的问题就是,在单独执行时,发现‘获取更新时间’步骤中,获取到的时间,确实是‘插入/更新’步骤执行后的值,

但是,如果通过bat调用,在计划任务中执行时,发现‘获取更新时间’步骤中,获取到的bcgxsj就不对了,查看日志,发现获取到的时间,是更新前的时间。 猜想,应该是kettle多线程的问题。再仔细看日志,发现执行的步骤好像有点不对 发现‘获取更新时间’这一步骤根本不是在’插入/更新‘后执行的,而是一开始就已经连接数据库查询,这样肯定出来的结果不可能是更新后的当前系统时间 这步骤甚至比’查找数据库当前时间‘更早执行。 网上查找原因: 在多线程软件下处理数据库连接,最推荐的方法是在转换执行的过程中为每个线程创建单一的连接。因此,每个步骤复制都打开它们自己单独的事务或者事务集。 这将导致一个潜在的后果,就是你在使用同一个数据库资源的场景下,例如一张数据表或者视图,条件竞争在同一个转换中可能而且会经常发生。 一个常见产生错误的场景,就是当你往一个关系数据表里面写入数据,在随后的步骤里面读回。因为这两个步骤运行在不同的数据库连接下,而且拥有不同的事务上下文,你不能确保这个被第一个步骤写入的数据将可见于其他正在执行读操作的步骤。

Kettle开发使用手册

Kettle开发使用手册2017年4月

版本历史说明

1.Kettle介绍 1.1.什么是Kettle Kettle是纯Java编写的、免费开源的ETL工具,主要用于抽取(Extraction)、转换(Transformation)、和装载(Loading)数据。Kettle中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。在这种思想的设计下,Kettle广泛用于不同数据库之间的数据抽取,例如Mysql数据库的数据传到Oracle,Oracle数据库的数据传到Greenplum数据库。1.2.Kettle的安装 Kettle工具是不需要安装的,直接网上下载解压就可以运行了。不过它依赖于Java,需要本地有JDK环境,如果是安装4.2或5.4版本,JDK需要1.5以上的版本,推荐1.6或1.7的JDK。 运行Kettle直接双击里面的批处理文件spoon.bat就行了,如图1.1所示: 图1.1

2.Kettle脚本开发 2.1.建立资源库(repository仓库) Repository仓库是用来存储所有kettle文件的文件系统,由于数据交换平台服务器管理kettle文件也是用Repository仓库,因此我们这边本地的kettle开发环境也是要用到该资源库。建立资源库的方式是工具 --> 资源库- -> 连接资源库,这时候弹出一个窗口,我们点击右上角的“+”号,跟着点击下面的kettle file repository选项,按确定,如图2.1所示: 图2.1 跟着在右上角选择一个目录,建议在kettle路径下新建repository文件夹,再选择这个文件夹作为根目录,名称和描述可以任意写,如图2.2所示: 图2.2 建完后会kettle工具会自动连接到repository资源库,每次打开kettle 也会弹出一个窗口让你先连接到资源库。在连接到资源库的情况下打开文件就是资源库所在目录了,如图2.3所示。注意你在资源库建的目录结构要跟数据交换平台的目录结构一致,这样写好kettle脚本,保存后放的路径能跟交换平台的目录结构一致了。

kettle入门例子大全

Kettle 培训技术文档0507 Etl 介绍 ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于金融IT 来说,经常会遇到大数据量的处理,转换,迁移,所以了解并掌握一种etl工具的使用,必不可少。 Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,数据抽取高 效稳定。Kettle中有两种脚本文件,transformation和job,transformation完成针 对数据的基础转换,job则完成整个工作流的控制。 kettle 部署运行 将kettle2.5.1文件夹拷贝到本地路径,例如D 盘根目录。 双击运行kettle文件夹下的spoon.bat文件,出现kettle欢迎界面:

稍等几秒 选择没有资源库,打开kettle主界面

创建transformation,job 点击页面左上角的创建一个新的transformation,点击保存到本地路 径,例如保存到D:/etltest下,保存文件名为EtltestTrans,kettle默认transformation 文件保存后后缀名为ktr 点击页面左上角的创建一个新的job,点击保存到本地路径,例如保 存到D:/etltest下,保存文件名为EtltestJob,kettle默认job文件保存后后缀名为kjb 创建数据库连接 在transformation页面下,点击左边的【Main Tree】,双击【DB连接】,进行 数据库连接配置。

connection name自命名连接名称Connection type选择需要连接的数据库Method of access选择连接类型 Server host name写入数据库服务器的ip地址Database name写入数据库名 Port number写入端口号 Username写入用户名 Password写入密码 例如如下配置:

pentaho-Kettle安装及使用说明(例子)

Kettle安装及使用说明 1.什么Kettle? Kettle是一个开源的ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)项目,项目名很有意思,水壶。按项目负责人Matt的说法:把各种数据放到一个壶里,然后呢,以一种你希望的格式流出。Kettle包括三大块: Spoon——转换/工作(transform/job)设计工具(GUI方式) Kitchen——工作(job)执行器(命令行方式) Span——转换(trasform)执行器(命令行方式) Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,数据抽取高 效稳定。Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。 2.Kettle简单例子 2.1下载及安装Kettle 下载地址:https://www.360docs.net/doc/1e7315601.html,/projects/pentaho/files 现在最新的版本是 3.6,为了统一版本,建议下载 3.2,即下载这个文件pdi-ce-3.2.0-stable.zip。 解压下载下来的文件,把它放在D:\下面。在D:\data-integration文件夹里,我们就可以看到Kettle的启动文件Kettle.exe或Spoon.bat。 2.2 启动Kettle 点击D:\data-integration\下面的Kettle.exe或Spoon.bat,过一会儿,就会出现Kettle的欢迎界面:

稍等几秒,就会出现Kettle的主界面: 2.3 创建transformation过程 a.配置数据环境 在做这个例子之前,我们需要先配置一下数据源,这个例子中,我们用到了三个数据库,分别是:Oracle、MySql、SQLServer,以及一个文本文件。而且都放置在不同的主机上。 Oralce:ip地址为192.168.1.103,Oracle的实例名为scgtoa,创建语句为:create table userInfo( id int primary key,

ETL之kettle进行二次开发简单demo

demo,利用kettle的api,将一个数据源中的信息导入到另外一个数据源中:[java]view plain copy 1.package https://www.360docs.net/doc/1e7315601.html,.saidi.job; 2. 3.import https://www.360docs.net/doc/1e7315601.html,mons.io.FileUtils; 4.import org.pentaho.di.core.KettleEnvironment; 5.import org.pentaho.di.core.database.DatabaseMeta; 6.import org.pentaho.di.core.exception.KettleDatabaseException; 7.import org.pentaho.di.core.exception.KettleXMLException; 8.import org.pentaho.di.core.plugins.PluginRegistry; 9.import org.pentaho.di.core.plugins.StepPluginType; 10.import org.pentaho.di.trans.TransHopMeta; 11.import org.pentaho.di.trans.TransMeta; 12.import org.pentaho.di.trans.step.StepMeta; 13.import org.pentaho.di.trans.steps.insertupdate.InsertUpdateMeta; 14.import org.pentaho.di.trans.steps.tableinput.TableInputMeta; 15. 16.import java.io.File; 17. 18./** 19. * Created by 戴桥冰 on 2017/1/16. 20. */ 21.public class TransDemo { 22. 23.public static TransDemo transDemo; 24. 25./** 26. * 两个库中的表名 27. */ 28.public static String bjdt_tablename = "test1"; 29.public static String kettle_tablename = "test2"; 30. 31./** 32. * 数据库连接信息,适用于DatabaseMeta其中一个构造器 DatabaseMeta(String xml) 33. */ 34.public static final String[] databasesXML = { 35. 36."" + 37."" + 38."bjdt" + 39."192.168.1.122" + 40."Mysql" +

自己总结的Kettle使用方法和成果

KETTLE使用自己总结的Kettle使用方法和成果说明 简介 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。 Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。 Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。 Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。 Kettle可以在https://www.360docs.net/doc/1e7315601.html,/网站下载到。 注:ETL,是英文Extract-Transform-Load 的缩写,用来描述将数据从来源端经过萃取(extract)、转置(transform)、加载(load)至目的端的过程。ETL 一词较常用在数据仓库,但其对象并不限于数据仓库。 下载和安装 首先,需要下载开源免费的pdi-ce软件压缩包,当前最新版本为5.20.0。 下载网址:https://www.360docs.net/doc/1e7315601.html,/projects/pentaho/files/Data%20Integration/然后,解压下载的软件压缩包:pdi-ce-5.2.0.0-209.zip,解压后会在当前目录下上传一个目录,名为data-integration。 由于Kettle是使用Java开发的,所以系统环境需要安装并且配置好JDK。 ?Kettle可以在https://www.360docs.net/doc/1e7315601.html,/网站下载 ? 下载kettle压缩包,因kettle为绿色软件,解压缩到任意本地路径即可。运行Kettle 进入到Kettle目录,如果Kettle部署在windows环境下,双击运行spoon.bat 或Kettle.exe文件。Linux用户需要运行spoon.sh文件,进入到Shell提示行窗口,进入到解压目录中执行下面的命令: # chmod +x spoon.sh # nohup ./spoon.sh &后台运行脚本 这样就可以打开配置Kettle脚本的UI界面。

kettle 使用中的一些常见问题

kettle 使用中的一些常见问题 问题1: 从excel 中抽取数据,插入到oracle 9 数据库中,报下面的错误. 2008/06/25 13:30:57 - 插入更新数据表.0 - Insert row: ![field1=1.3965E8, field2=1,798, field3=2002/05/27 00:00:00.000] 2008/06/25 13:30:57 - oracl - ERROR : java.sql.SQLException: ORA-01722: 无效数字2008/06/25 13:30:57 - oracl - ERROR : at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125) 原因: 从错误信息可以看出,字段"field2" 对应的数据是1,798,该字段在数据库中是Number 类型,Oracle 不能将1,798 格式的字符串转换为数字。 解决方法: 在【Excel输入步骤】-【字段】标签下对应的字段设置为正确的类型。将"field2" 设置为"Number" 类型(默认是String 类型)。 问题2: 由sqlserver 向mysql 迁移数据, 迁移以后的数据是乱码 原因: 这是由于mysql 的默认编码是utf-8, 而中文环境下客户端的默认编码一般都是gbk 或gb18030, 由于客户端和服务器编码不一样导致保存到mysql 的数据是乱码 解决方法: 在新建连接窗口中有一个选项(option) 标签, 在这个标签下可以设置数据库的一些连接参数. 在这里我们要设置mysql 的客户端编码参数, 参数名characterEncoding, 参数值gbk. 问题3: 在SQLServer 表输入步骤中使用以问号作为参数的sql 语句(参数的值从以前的步骤中获得),向mysql 数据库导入数据(使用mysql 表输出步骤). 在执行的时候报告错误Unable to get queryfields for SQL: AND e.LOCAL_TIME>? 00909 PRS INC Invalid character. 原因: 从错误语句看,是参数没有被替换掉, 因为发送给mysql 服务器的是这样的语句"AND e.LOCAL_TIME>?". 参数没有被替换掉是因为从以前步骤中读取的参数值是null. 解决方法: 增加对null 值的判断, 可以有两种方法, 如果这个值是从数据库获取的,一般的数据库都提供了处理null值的函数,如mysql 的ISNULL 函数. 如果这个值是从其他步骤获得的,可以通过Javascript 步骤进行判断并转换. 问题4: 使用PDI 3.x 版本连接DB2 数据库时会报下面的错误 Error connecting to database: (using class com.ibm.db2.jcc.DB2Driver) encoding not supported!!

Kettle使用手册

Kettle培训手册 Etl介绍 ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于金融IT来说,经常会遇到大数据量的处理,转换,迁移,所以了解并掌握一种etl工具的使用,必不可少。 Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,数据抽取高效稳定。Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。 kettle部署运行 将kettle2.5.1文件夹拷贝到本地路径,例如D盘根目录。 双击运行kettle文件夹下的spoon.bat文件,出现kettle欢迎界面:

稍等几秒 选择没有资源库,打开kettle主界面

创建transformation,job 点击页面左上角的解并到本地路径,例如保存到D:/etltest下,保存文件名为EtltestTrans,kettle默认transformation 文件保存后后缀名为ktr 点击页面左上角的解并到本地路径,例如保存到D:/etltest下,保存文件名为EtltestJob,kettle默认job文件保存后后缀名为kjb 创建数据库连接

在transformation页面下,点击左边的【Main Tree】,双击【DB连接】,进行数据库连接配置。 Connection name自命名连接名称 Connection type选择需要连接的数据库 Method of access选择连接类型 Server host name写入数据库服务器的ip地址 Database name写入数据库名 Port number写入端口号 Username写入用户名 Password写入密码 例如如下配置:

Pentaho ETL工具Kettle转换实现原理

关于Pentaho ETL工具Kettle转换实现原理的研究·ETL和Kettle简介 ETL即数据抽取(Extract)、转换(Transform)、装载(Load)的过程。它是构建数据仓库的重要环节。数据仓库是面向主题的、集成的、稳定的且随时间不断变化的数据集合,用以支持经营管理中的决策制定过程。 Kettle 是”Kettle E.T.T.L. Envirnonment”只取首字母的缩写,这意味着它被设计用来帮助你实现你的ETTL 需要:抽取、转换、装入和加载数据;翻译成中文名称应该叫水壶,名字的起源正如该项目的主程序员MATT 在一个论坛里说的哪样:希望把各种数据放到一个壶里然后以一种指定的格式流出。 Kettle的四大块: Chef——工作(job)设计工具(GUI方式) Kitchen——工作(job)执行器(命令行方式) Spoon——转换(transform)设计工具(GUI方式) Pan——转换(trasform)执行器(命令行方式) Spoon 是一个图形用户界面,它允许你运行转换或者任务,其中转换是用Pan 工具来运行,任务是用Kitchen 来运行。Pan 是一个数据转换引擎,它可以执行很多功能,例如:从不同的数据源读取、操作和写入数据。Kitchen 是一个可以运行利用XML 或数据资源库描述的任务。通常任务是在规定的时间间隔内用批处理的模式自动运行。下面将具体介绍Pan,和Kitchen在ETL中的实现过程。 ·数据转换原理及具体实现过程 大致步骤如下:

转换的过程中(在windows环境下),首先会调用Pan.bat,这一步主要是做一些初始化,连接验证,环境设置,检查之类;然后在Pan的最后一步会调用launcher.jar包,这个包用于启动JDBC驱动,并向JDBC传入相关连接信息和参数,然后开始传数据,最后是完成数据传输,关闭相关协议,写入日志。 首先来看Kitchen的实现,Kitchen在一个job中一般包含以下几个步骤: 转换:指定更细的转换任务,通过Spoon生成。通过Field来输入参数; SQL:sql语句执行; FTP:下载ftp文件; 邮件:发送邮件; 检查表是否存在; 检查文件是否存在; 执行shell脚本:如dos命令。 批处理:(注意:windows批处理不能有输出到控制台)。 Job包:作为嵌套作业使用。 SFTP:安全的Ftp协议传输; HTTP方式的上/下传。 以下是一个简单的ETL过程:

kettle使用手册

1打开程序,点击 spoon.bat 其实对于简单的数据库数据的抽取,基本只需要转换(.ktr格式)和作业(.kjb格式)这两种东西。下面就是建立一个转换的步骤: a 点击文件-->新建-->转换。 b 在左侧的树状列表中选“主对象树”,新建DB连接(参照第4点)。 c 在核心对象-->输入这个地方拖出一个表输入,在“输出”目录下拖出“表输出”,按住shift,从一个对象拖到另一个对象可进行连线。 2基本作业由开始,转换,成功3步骤组成。步骤之间使用shift+左键连线。 2.1‘1’代表无条件执行; 2.2‘2’代表上一步执行完成后,再执行下一步; 2.3‘3’代表不执行,左击连接线使其生效(绿色)或失效(灰色)。

3打开具体步骤中的转换流程,点击‘Transformation’跳转至相应具体转换流程, 编辑此转换具体路径,双击转换,弹出窗口,‘1’为相对路径,点击‘2’选择具体Visit.ktr 转换,为绝对路径。

4建立数据库连接,输入相应信息测试,成功即可 图4 5转换具体设置,如图4,‘表输出’至‘文本文件输出’流程跳接线为错误处理步骤,当输出格式不能满足表输出的目的表结构类型时,将会将记录输出到‘文本文件输出’

中的记录中。 5.1双击‘表输入’,输入相应的SSQL语句,选择配置数据库连接,或新增,预览查询 生成的结果(如果数据库配置中使用变量获取,此处预览生成错误)。 5.2双击‘表输出’,选择数据库连接,‘浏览’选择相应目标表,(此处‘使用批量插 入’勾选去除,目的是在错误处理步骤中无法使用批量处理,可能是插件兼容问 题) 6表输出插件定义 a) Target Schema:目标模式。要写数据的表的Schema的名称。允许表明中包含“。”对数据源来 说是很重要的 b) 目标表:要写数据的表名。

kettle转换步骤的类型功能

文本文件输入(text input):读取大量不同的文本文件。大多是通过工具生成的CSV文件。 表输入(table Input):常用来利用连接和SQL,从数据中读取信息,自动生成基本的SQL语句。 获取系统信息(get system info):这个步骤从Kettle 环境中获取信息。 生成行(Generate Rows ):这个步骤输出一定数量的行,缺省为空。可选包括一定数量的静态字段。 Cube输入(文件反序列化)(De-serialize from file):从二进制Kettle Cube 文件中读取数据行。备注:这个步骤仅仅用来存储短期数据。不同版本之间不保证文件的格式一样。 XBase输入:使用这一步可以读取大多数被称为XBase family派生的DBF文件。 Excel输入:利用这个步骤可以从Kettle 支持的系统的Excel文件里面读取数据。 XML输入:这个步骤允许你读取存储在XML 文件中的数据。它也提供一个接口,你可以定义你想读取的文件名、XML 文件的数据重复部分、获取的字段等。你可以指定元素或属性字段。 获取文件名(Get File Names):这个步骤可以获取系统的文件名信息。 文本文件输出(Text File Output): 表输出(Table output):这个步骤可以存储信息到数据库表中。 插入/更新(Insert/Update):这个步骤利用查询关键字在表中搜索行。如果行没有找到,就插入行。如果能被找到,并且要被更新的字段没有任何改变,就什么也不做。如果有不同,行就会被更新。 更新(Update ):这个步骤类似于插入/更新步骤,除了对数据表不作插入操作之外。它仅仅执行更新操作。 删除(Delete):这个步骤类似于上一步,除了不更新操作。所有的行均被删除。 Cube output(序列化到文件)(Serialize to file):这一步骤存储数据到一个二进制文件。这个步骤有个优势就是回读的时候,文本文件的内容不需要解析。这是因为元数据也同时存储在CUBE 文件里面。 XML输出:这个步骤允许你从源中写入行到一个或者多个XML 文件。 EXCEL输出:利用这个步骤,在Kettle 支持的系统中,你可以写入数据到一个或者多个

开源ETL工具kettle系列之动态转换

摘要:本文主要讨论使用Kettle来设计一些较为复杂和动态的转换可能使用到的一些技巧,这些技巧可能会让你在使用Kettle的时候更加容易的设计更强大的ETL任务。 动态参数的传递 Kettle 在处理运行时输入参数可以使用JavaScript 来实现,大部分工作只是按照一个模板来处理的 动态参数传递主要使用在像数据清理,调式,测试,完成复杂的条件过滤等等,这种方式一般不会在产品已经运行稳定了一段时间之后使用,因为我们一般仍然是做定时任务来自动转换数据,所以在开始介绍如何使用动态参数之前,希望大家能明白不要在产品数据库上做实验,即使你已经知道你的转换有什么影响并且做了备份,因为这种方法是不可能自动执行的。 Kettle有两种动态参数传递的方法,一种是非常轻量级的传argument , 另一种是对付较复杂一点情况使用JavaScript . 下面分别介绍这两种方法。 1. argument 当你在运行一个转换的时候,不管这个转换是一个Job的一部分还是只有这个转换,你都可以传递参数给它,当你运行一个转换的时候,会弹出一个Execution a Transformation 的对话框,让你选择执行转换的方式,本地执行,远程执行,分布式执行,下面就是日志记录的级别和回放时间,然后是argument 和variables 的设定。Argument 和variables 的区别在官方FAQ里面也有解释。你也可以参考一下官方的解释和下面解释的异同。 Q : Argument 和variables 的区别/ A : variables 也可以认为叫做environment variables , 就像它的名字一样,主要是用来设定环境变量的,比如最常见的:文件的存放地址,smtp的配置等等,你也可以把它认为是编程语言里面的全局变量,即使是不同的转换它们也拥有同样的值,而argument 自然就类似与局部变量,只针对一个特定的转换,比如像是限定结果集的大小和过滤条件。 取得argument的值 我们在转换之前设置了argument的值,需要用到的时候就使用get system info 步骤,这个步骤取得在运行时参数,需要注意的是我们是先设置get system info ,然后在里面决定要使用多少个参数,最多10个,每个参数名叫什么,然后我们才能在运行时看到你设置了的参数名后面跟一个要你输入的值,并且参数类型是不能够指定,全部都当作字符串处理,如果你需要对参数类型有要求,你需要自己转换,使用一个Mapping步骤或者Select values步骤。 取得variable的值 Variable 的值个数不受限制,你可以在kettle菜单的set environment里面设置,也可以使用文件储存这些值,在第一次运行kettle之后,kettle会在%HOME_USER_FOLDER%菜单里面创建一个 .kettle文件夹,如果是windows 用户可能就是C:\Documents and Settings\${your user name}\.kettle这个文件夹,如果是linux用户可能就是/home/${your user name }/.kettle文件夹,这个文件夹下面有kettle.properties文件,如果你打开这个文件,你会发现里面有一些以#开头的注释,其中设置了一些像是:PRODUCTION_SERVER = Hercules 这样的键值对,你可以自己定义一些环境变量比如像是smtp的地址,ftp服务器的地址,你放log文件的目录名等等,当然不能直接编辑这个文件就设置环境变量,要先设置KETTLE_HOME环境变量,windows就是点我的电脑,然后在设置path的那个地方添加一个KETTLE_HOME变量,linux就是export KETTLE_HOME=’一个目录’,这个目录可以任意地方,不过一般还是指向kettle的安装目录或是你自己的文档目录,然后启动kettle它会创建一个新的.kettle目录,编辑里面的kettle.properties文件就可以设置环境变量了. 2. 使用脚本 Kettle使用的是JavaScript来作为它的脚本实现,使用的是mozilla 的rhino 1.5r5版本实现,如果你打算

Kettle5.x使用步骤带案例超详细版精编版

Kettle使用方法介绍 1、Kettle概念 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix 上运行,绿色无需安装,数据抽取高效稳定。 Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。 Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。 Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。 2、下载和部署 下载kettle压缩包,因kettle为绿色软件,解压缩到任意本地路径即可 3、Kettle环境配置 1.安装JDK(略) 2.测试JDK安装成功(略) 3.运行Kettle Windows下找到$KETTLE_HOME/spoon.dat,双击运行 欢迎界面如下图所示:

4、KETTLE组件介绍与使用 4.1 Kettle使用 Kettle提供了资源库的方式来整合所有的工作,; 1)创建一个新的transformation,点击保存到本地路径,例如保存到D:/etltest下,保存文件名为Trans,kettle默认transformation文件保存后后缀名为ktr; 2)创建一个新的job,点击保存到本地路径,例如保存到D:/etltest下,保存文件名为Job,kettle默认job文件保存后后缀名为kjb; 4.2 组件树介绍 4.2.1Transformation 的主对象树和核心对象分别如下图:

kettle增量更新设计

kettle增量更新设计 ETL中增量更新是一个比较依赖与工具和设计方法的过程, Kettle中主要提供sert/ Update步骤, Delete步骤和 Database Lookup步骤来支持增量更新增量更新的设计方法也是根据应用场景来选取的,虽然本文讨论的是 Kettle的实现方式,但也许对其他工具也有一些帮助。 1、增量分类 应用场景增量更新按照数据种类的不同大概可以分成: 1、增加,不更新 2、更新,不增加 3、即增加也更新 4、有删除,有增加,有更新 其中1,2,3种大概都是相同的思路,使用的步骤可能略有不同,通用的方法是在原数据库增加一个时间戳,然后在转换之后的对应表保留这个时间戳,然后每次抽取数据的时候,先读取这个目标数据库表的时间戳的最大值,把这个值当作参数传给原数据库的相应表,根据这个时间戳来做限定条件来抽取数据,抽取之后同样要保留这个时间戳,并且原数据库的时间戳一定是指定默认值为date当前(以原数据库的时间为标准),抽取之后的目标数据库的时戬要保留原来的时间戳,而不是抽取时候的时间。 对于第一种情况,可以使用 Kettle的 Insert/ Update步骤,只是可以勾选Don' t perform any update选项,这个选项可以告诉 Kettle你只会执行 Insert步骤。 对于第二种情況可能比较用在数据出现错误然后原数据库有一些更新,相应的标数据库也要更新,这时可能不是更新所有的数据,而是有一些限定条件的数排你可以使用 Kettle 的 Update步骤来只执行更新。关于如何动态的执行限定条件,可以参考前一篇文章。 第三种情况是最为常见的一种情況,使用的同样是 Kettle的 Insert/ Update步骤,只是不要勾选Don' t perform any update选项第四种情況有些复杂,后面专门讨论:对于第1,2,3种个以参考下面的例子这个例子假设原数据库表为 customers,含有一个id, firstname,1 astnameage字段,主键为id,然后还加默认值为 sysdate的时间戳字段。转换之后的结果类似:id, firstname,1 astname,age, updatedate.整个设计流程大概如: 其中第一个步骤的sql 大概如下模式: Select max(updatedate) from target_customer ; 你会注意到第二个步骤和第一个步骤的连接是黄色的线,这是因为第二个table input 步骤把前面一个步骤的输出当作一个参数来用,所有Kettle用黄色的线来表示,第二个table input 的sql 模式大概如下: Select field1 , field2 , field3 from customers where updatedate > ? 后面的一个问号就是表示它需要接受一个参数,你在这个table

ETL利器KETTLE实战应用解析系列一 KETTLE使用介绍

ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种etl工具的使用,必不可少,这里我介绍一个我在工作中使用了3年左右的ETL工具Kettle,本着好东西不独享的想法,跟大家分享碰撞交流一下!在使用中我感觉这个工具真的很强大,支持图形化的GUI 设计界面,然后可以以工作流的形式流转,在做一些简单或复杂的数据抽取、质量检测、数据清洗、数据转换、数据过滤等方面有着比较稳定的表现,其中最主要的我们通过熟练的应用它,减少了非常多的研发工作量,提高了我们的工作效率,不过对于我这个.net研发者来说唯一的遗憾就是这个工具是Java编写的。 1、Kettle概念 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。 Kettle中文名称叫水壶,该项目的主程序员MATT希望把各种数据放到一个壶里,然后以一种指定的格式流出。 Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。 Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。 2、下载和部署 Kettle可以在https://www.360docs.net/doc/1e7315601.html,/网站下载 下载kettle压缩包,因kettle为绿色软件,解压缩到任意本地路径即可 3、Kettle环境配置(有Java环境的直接忽略此章节) 3、1安装java JDK 1)首先到官网上下载对应JDK包,JDK1.5或以上版本就行; 2)安装JDK; 3)配置环境变量,附配置方式:

kettle之多表数据复制

kettle之------ 多表数据复制 需求:把A库中N个表抽取至B库中,表结构相同或只是增加统一的一些字段,过滤条件基本类似。 解决方法: 我们把以上内容在解决问题上拆分为二步, 1,从一配制表中读出相应的表名及过滤条件,存于一结果。 2,根据第一步的结果,一条条循环来进行取数插数的过程。 以上过程相当简单,以下为讨论的实现方式。 1,如果是ORACLE同字符集,用DBLINK结合着存储过程,写一个通用的程序很容易搞定,只需要建立一个表名及过滤条件的配制表(在此就不多说了)。 2,用ETL工具实现,据我所知,以infa为例,它以字段为对应关系,且它的流程内部循环相当困难,曾经我们有个项目,infa就是硬生生的画了一二百个mapping(的确,不会累死人,但看着相当不爽,当然,欢迎提供好的方案), 在此,我们以kettle为例进行分析,如何解决这个问题(先抛开性能,kettle的确是个好东西) 1),主流程大概是如下这样的 在此,我们再看一下第一组件(得到多表表名)里面内容, 我们再看一下得到表名中的内容

这其中的sql只是模拟一个得到表名的sql,可灵活使用,这个组件其实就完成了把要抽取的表放入一个结果集中了。 我们再看第二个组件(表迁移) 就是一个取数一个插数的过程。 再看一下它们的内容 在此就完成了,但是,我们主job设置(表迁移)组件时,也就是把前面的内容当后面的参数循环执行。

基本就是如此,另,记得在各主流程及二转换中都设置tt_tab这个参数。 说了这么多,其实很简单。如果你是要做数据库表复制的话,kettle有其它的方式,可以根据工具-》向导-》复制表向导完成。 以上这种适应的是,可实现一些sql的拼接,且要增加减少表时只需求维护配制表了,相对来说会变的简单。。 kettle交流群87340451

kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)

kettle中通过时间戳(timestamp)方式来实现数据库的增 量同步操作(一) 这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表tt1 和表tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新表中的数据进行更新。 实验数据如下: mysql database 5.1 test.tt1( id int primary key , name varchar(50) ); mysql.tt2( id int primary key, name varchar(50) ); 快照表,可以将其存放在test数据库中, 同样可以为了简便,可以将其创建为temporary 表类型。数据如图kettle-1 kettle-1 ============================================== ==============

主流程如图kettle-2 kettle-2 在prepare中,向tt1,tt2 表中增加时间戳字段, 由于tt1,tt2所在的数据库是不同的,所以分别创建两个数据库的连接。 prepare kettle-3 在执行这个job之后,就会在数据库查询的时候看到下面的字段: kettle-4 然后,我们来对tt1表做一个insert 操作一个update操作吧~ kettle-5 在原表上无论是insert操作还是update操作,对应的updateTime都会发生变更。

如果tt1 表和tt2 表中updateTime 字段为最新时间的话,则说明该表是新表。 下面只要是对应main_thread的截图: kettle-6 在这里介绍一下Main的层次: Main START Main.prepare Main.main_thread { START main_thread.create_tempTable main_thread.insert_tempTable main_thread.tt1_tt2_syn SUCCESS } Main.finish SUCCESS

bat脚本调用kettle

Kettle学习文档1 Kettle 的定时任务可以用kettle中的job工作来定时转换,也可以使用bat脚本来启动kettle的‘.ktr’转换。 Bat脚本可在Windows上直接双击运行;也可以在‘计算机管理-->任务计划程序’中添加,并定时启动;还可以在Windows点击运行,输入cmd,在dos窗口输入命令启动。在Linux环境下启动转换的方法与Windows上差不多,所以并未多做实验。 1、新建文档,保存格式为‘name.bat’,bat脚本: d: cd D:\hgy\pdi-ce-7.0.0.0-25\data-integration pan /file D:\hgy\learn\kettle\kettle_files\test_learn1.ktr /level Basic>>D:\hgy\kettle.log 脚本解释:‘d:’是进去d盘下,‘cd’打开kettle解压的文件夹下pan所在目录,命令‘pan’启动‘.ktr’转换文件;‘pan’是启动‘.ktr’文件, ‘kitchen’是启动‘.kjb’文件。 ‘D:\hgy\kettle.log’是将日志写入这个文档。 ‘pan’或‘kitchen’后面可跟参数含义:

而参数后面可以是=也可以是:也可以是空格 kitchen.bat /file d:\ 或者-file=D:\ 或者/file:D:\等等都可以2、在dos窗口调用时,就将1中的bat文件一行一行输入。 3、任务计划程序启动

右键任务计划程序,创建基本任务:

测试时可以直接点旁边的运行:

然后可以再日志里面看到: 附:

相关文档
最新文档