Kettle使用中的20个常见问题 | 您所在的位置:网站首页 › hi3593使用问题 › Kettle使用中的20个常见问题 |
Kettle源码下载地址: https://github.com/pentaho/pentaho-kettle Kettle软件下载地址: https://sourceforge.net/projects/pentaho/files/Data%20Integration 一、Linux中如何部署kettle:(以root用户操作为例)1、将window中正常使用的kettle的data-integration文件夹压缩成tar包; 2、将tar包上传到linux的指定文件夹中去; 3、利用tar命令将tar包进行解压; 4、运行./kitchen.sh命令,出现options内容,表示部署正常: 6、通过以上步骤,就可以完成对kettle在linux上的部署工作。 二、Linux登录kettle的文件资源库或数据库资源库说明:在window中可以通过可视化界面来登录kettle的资源库,在linux中没有可视化界面,windows中kettle的资源库信息是存储在一个配置文件中的,只需要将该配置文件上传到linux中指定文件位置即可,在执行某个转换或作业的时候,在命令中输入相应的资源库即可; 1、找到window中存储kettle资源库信息的配置文件: 4、将该配置文件上传到linux中部署kettle用户文件下隐藏的.kettle文件夹下,本人是利用root用户部署的,因此放在/root/.kettle文件夹下即可: 1、首先要完成kettle中作业或转换所在的资源库迁移到linux上; 2、将需要执行的转换或作业文件迁移到linux中指定的文件资源库中去; 命令例子: 1、首先,完成对window中登录数据库资源库配置文件上传到Linux中对应的位置; 2、然后登录linux,进入到Kettle的data-integration文件夹下,就可以通过百度linux kettle 命令行 ktr/job进行执行了。 1、文件资源库导入到数据库资源库: (1)首先,在kettle软件中登录到数据库资源库; (2)然后,文件—从xml文件中导入,选择自己要导入的作业或转换,然后ctrl+s保存即可; (1)首先,在kettle软件中登录到数据库资源库; (2)然后,文件—导出-----导出到xml文件即可; 通常jar包文件放到了 data-integration\libswt\win32 下面,当然也可以放到data-integration\lib等程序可以找到的位置。Kettle软件部署在不同操作系统中,连接各种数据库的驱动jar包防止的位置是不同的,与操作系统有关,不同的操作系统上,驱动jar包放在对应的文件夹中即可,如下图: kettle可以实现从不同数据源(excel、数据库、文本文件等)获取数据,然后将数据进行整合、转换处理,可以再将数据输出到指定的位置(excel、数据库、文本文件)等; 通过kettle处理大量数据非常方便,如果window服务器或者Linux服务器硬件一般情况下,对于处理千万级一下的数据都是可以的; 八、Kettle作业与转换如何配合使用:1、一个作业相当于一个主要任务项,在这个主线中可以调用其它若干个转换,每个转换中可以从作业这个主线中获取数据,然后将数据进行相应的处理操作,再将数据传递给作业主线,也可以在转换中单独获取数据------处理数据------输出数据; 2、并且如果对于需要设置变量的情况下,一般也是需要用到作业与转换的配合使用,因为变量在当前线中设置,不能再当前线中获取,需要到下一个线中才能够获取; 3、一个任务只能够有一个主作业,但是可以有多个子作业,主作业中可以调用转换,也可以调用子作业,具体是调用转换还是调用子作业,需要根据不同的需求,进行不同的定制; 九、Kettle中设置编码格式:如果处理的数据中有中文,需要对中文设置编码格式,一般是utf8格式,彻底的修改格式的方法就是,修改spoon.bat文件中增加如下信息:"-Dfile.encoding=UTF-8"; Kettle默认的性能适用于普通的一般硬件,如果自己的电脑硬件比较好(内存比较大),可以对kettle的spoon.bat中的参数进行修改,这样可以适当的提高kettle的运行性能,主要是修改-Xms、-Xmx、-XX:MaxPermSize三个参数的值: -Xms:设置JVM初始内存 ; -Xmx:设置JVM最大可用内存 ; -XX:MaxPermSize:设置JVM最大允许分配内存,按需分配; 非常注意: 1、 -Xmx必须小于等于系统内存的1/4,要不然会报错,其他两个选项不大于-Xmx ; 2、当系统内存为4G时-Xmx不能大于1G,当系统内存为8G或更大时,java版本必须是64位的才能识别出来,此时-Xmx可以为2G或更高 自己配置的信息:window服务器内存8G: -XX:MaxPermSize = -Xmx = 4096m; -Xms = 1024m 1、通用——START:作业开始; 2、通用——作业:指定某个作业循环执行; 3、通用——转换:指定某个转换,加入到作业中来; 4、通用——设置变量:设置变量,为了转换或者作业中获取变量; 5、通用——成功:作业完成操作; 6、通用——DUMMY:空操作,什么也不执行; 7、邮件——发送邮件:给指定邮箱发送邮件,发件人的账号需要开通第三方发送邮件的功能; 8、文件管理——复制/移动结果文件:复制/移动文件; 9、文件管理——创建一个目录:创建指定的目录; 10、文件管理——删除一个文件:删除指定的一个文件; 11、文件管理——复制文件:复制指定的文件; 12、文件管理——删除目录:删除指定的目录; 13、文件管理——删除多个文件:通过正则表达式批量删除文件; 14、条件——检查数据库连接:检查数据库是否能够连接通; 15、条件——检查表是否存在:检查指定的表是否存在; 16、文件传输——SFTP下载:可以通过SSH进行远程下载文件; 17、文件传输——SFTP上传:可以通过SSH进行远程上传文件; 18、文件传输——FTP删除:可以远程删除指定的文件; (2)转换中常用控件:1、输入——Excel输入:从excel文件中读取数据; 2、输入——文本文件输入:从文本文件中读取数据; 3、输入——生成随机数:用来生成指定类型的随机数; 4、输入——自定义数据常量:将值不变的变量存入到此处,方便管理; 5、输入——获取系统信息:可以获取系统信息(日期、命令行参数); 6、输入——表输入:从数据库表中读取数据; 7、输出——Excle输出:注意.xls格式输出行数有限制,一般输出.xlsx最好; 8、输出——插入/更新:根据指定的匹配字段,可以检测是插入新数据,还是修改旧数据; 9、输出——文本文件输出:将结果数据输出到文本文件中去; 10、输出——表输出:将结果数据输出到某个数据库的某个表中; 11、转换——增加常量:在原数据中将常量值增加新一列; 12、转换——排序记录:对原数据按照某个字段进行排序; 13、转换——剪切字符串:对字符串进行截图; 14、转换——去重复记录:对于某个字段有重复的记录进行过滤; 15、转换——字段选择:筛选流中的字段,慎用,过滤后后面的控件将无法获取流中筛除的字段了; 16、流程——空操作:将不需要的数据放到此处,类似垃圾箱; 17、流程——过滤记录:按照条件进行过滤,类似if-else; 18、流程——Switch/Case:与java中switch/case一样; 19、脚本——java代码:执行java代码; 20、脚本——javascript代码:执行javascript代码; 21、脚本——执行SQL脚本:执行sql; 22、连接——记录集连接:类似于sql的left join/right join/inner join,但是使用前的数据必须要经过排序; 23、作业——从结果获取记录:从作业中获取数据; 24、作业——复制记录到结果:将转换中的结果数据放到作业中去; 25、作业——获取变量:从作业中获取变量; 26、作业——设置变量:设置变量,从而让作业中能够获取变量; 十二、Kettle中javascript脚本执行:在javascript脚本中可以直接定义变量,可以直接从上一个控件中获取值,获取值的方法直接写前一个控件中某列的列明就好,定义的变量在后续的控件中都可以直接获取: 1、javascript生成uuid的代码: var uuid = replace(java.util.UUID.randomUUID(),"_","");2、Javascript截取前一个控件中某个字段的长度,获取另外一个变量: var choice = substr(tydm,0,4);0:开始截取的角标;4:表示截取的长度; 十四、Kettle中常见的异常处理: 1、异常类型:java.lang.stackOverFlowError原因:栈溢出,可能是在处理的数据比较大,栈默认值不够使用了; 解决方法:修改kettle中的启动项spoon.bat中的信息,添加一个Xss=1024m即可解决,如果还不够,可根据硬件来适当增加值; 设置编码格式,具体操作上述有步骤; 3、连接不上数据库,报java.lang.NullPointerException异常:原因:kettle中放置的连接数据库的驱动jar包版本低于要连接的数据库版本; 解决方法:首先查看自己要连接的数据库版本,然后选择驱动jar包版本要对应或者高于但要最接近于数据库版本的jar包即可解决; 4、启动kettle:Prepared statement contains too many placeholders表输出每次提交的设置数量太高了,降低每次输出数量即可解决问题; 5、正常运行一会突然报错:Communications link failure错误一: java.net.SocketException: Connection reset by peer: socket write error错误二: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.产生上述两个错误的原因:可能是kettle默认使用的是服务端提供的statement,因为一些原因服务端可能会关闭statement,因此要对连接的数据库设置一些参数,使用kettle自身提供的statement就可以 (1)解决问题:设置参数如下: useServerPrepStmts=false rewriteBatchedStatements=true useCompression=true
(4)如果数据量多,请求有修改,可能是锁了sql了,需要将innodb_lock_wait_timeout值设置大点,如果数据量特别大,那就值更大点。就可以解决问题了。 (2)Xms和Xmx:等于JAVAMAXMEM的大小; (3)Xmn:为xmx的3/8 (4)Xss:一般1024够了,主要是防止StackOverFlowError出现的。 7、多张表关联插入时,报:Unable to write value data to output stream,No space left on device:(临时文件输出到指定地方,该地方磁盘空间不够) 解决方法: (1)将排序目录指定到一个磁盘比较大的位置; (2)将排序缓存大小设置的适当小点; (3)将临时文件进行压缩; (4)排序目录默认的就是系统配置的kettle_home的路径,一般直接写outs就行,并在kettle_home路径下创建一个outs文件夹即可; (1)可能是kettle用的mysql-connection的jar包版本问题,换个与mysql数据库最接近的jar包版本。 (2)可能是某一个转换中用了事物,应该去掉事物的。 9、java.lang.ClassNotFoundException: org.safehaus.uuid.UUIDGenerator 原因1:kettle作业用生成UUID随机数使用的是UUID,把UUID改成UUID4就可以解决问题了。 原因2:如果是数据写入临时文件时出现这个异常,那么就需要修改Kettle的源码了,然后将编译后的.class文件放在kettle-core的jar包中对应的文件夹下进行替换即可: 解决方法:给数据配置以下信息: net_read_timeout=28800 net_write_timeout=28800 innodb_lock_wait_timeout=500 十五、Kettle解析XML文件获取数据:1、核心思路:就是指定要循环读取XML的路径,并指定该路径下每个字段对应的路径,以便kettle能够循环读取XML中的数据,从而获取所有记录中不同字段的值。 2、具体步骤如下: (1)选择XML文件路径(如果文件中各种节点路径一模一样,可以选择多个文件,也可以通过正则表达式等选择一定规则的多个文件): 1、检查连接数据库的驱动版本,要做到jar包的版本和数据库版本尽量接近; 2、创建数据库连接的url中必须加上以下两个参数: ?autoReconnect=true&failOverReadOnly=false useServerPrepStmts=false rewriteBatchedStatements=true useCompression=true Windows: 7、在作业中调用的任何一个转换,都要将该转换输出到data-integration/logs文件夹下,参数设置如下:(在kettle转换和作用中,默认的当前目录就是KETTLE_HOME设定的data-integration目录下) 11、在每一个作业中,最好使用一个发邮件功能,在开始和成功中间任何一个步骤到发出一个异常流程,指向发邮件,这样如果作业中任何一个环节出现异常,就会自动给指定的邮箱进行发送邮件(非常注意:发送邮件的发送邮箱一定要开通第三方授权码,通过授权码作为密码来发送功能) 12、在每一个作业开始执行时,都要添加一个检查数据库连接控件,用来检查该作业中所有用到的数据库连接是否能够正常连接,如果连接不上,则可以通过发送邮件进行提醒,如果不检查的话,数据库因为网络通信问题连接不上,kettle作业中的异常是不会发送邮件的: 非常注意:如果检测的是多个数据库连接,那么只有所有的数据库都能连接上,才算是正确,如果有任何一个数据库连接不上,都会是异常。 (1)不是更新所有字段,而是先判断该字段是否发生变化,如果发生变化了就只更新该字段+更新时间,两个字段值; (2)因此需要对获取的记录通过复制的方式,分发给不同字段判断的过滤条件控件; (3)在更新控件中,一定要勾选批量更新、跳过查询,可以提高速度。 1、主题思路: 有主作业、子作业两个作业组成这个流程,在主作业中,首先调用一个转换用来获取指定库中所有的表名、表sql等内容复制到结果记录,然后调用一个子作业,子作业中先调用一个转换用来结果记录中的信息,然后设置变量,变量有效范围为parent_job,然后子作业再调用一个转换,用来执行sql脚本创建表结构和获取源数据表中的数据再输出到对应的目标数据库中表中即可,因为字段名称是一致的,所以不需要指定字段映射; 2、实现过程截图: 自我感悟:如果想要动态的设置变量,就需要在主作业中嵌套一个子作业,子作业中调用一个转换,转换的功能就是通过从子作业的上一步中获取结果信息,然后将信息设置成变量,变量的有效范围parent-job; Kettle首先是通过KETTLE_HOME下寻找.kettle文件下的资源库,如果没有配置KETTLE_HOME那么kettle寻找资源库是通过当前登录用户下的.kettle文件寻找资源库; 十九、Kettle修改资源库登录用户密码:Kettle资源库创建好后,有默认的admin/admin、guest/guest两个用户,修改用户登录密码操作如下图所示: 1、在表输出后添加一个异常输出到excel文件的控件,输出字段自己选择,这样可以让异常数据中的信息输出到excel中; |
CopyRight 2018-2019 实验室设备网 版权所有 |