kettle实践


kettle使用carte方式部署简单方案

没有使用carte集群,运行100多个job,压力主要在数据库,所以没有使用集群

在Linux上只启动一个carte,使用windos提交任务到远程linux上执行

使用carte提供的界面进行任务的管理,任务提交以后windos客户端可以关闭,jdk部署就不再阐述


1. 配置内容

vi  /usr/kettle/data-integration/pwd/carte-config-master-8080.xml(kettle部署地址)

  <slaveserver>
    <name>master1</name>
    <hostname>本机IP地址</hostname>
    <port>8082</port>
    <master>Y</master>
  </slaveserver>
 
  <max_log_lines>1000</max_log_lines>
  <max_log_timeout_minutes>1</max_log_timeout_minutes>
  <object_timeout_minutes>1</object_timeout_minutes>

2. 设置kettle环境变量

vi /etc/profile
export KETTLE_HOME=/usr/kettle/data-integration
source /etc/profile

将config.properties放在/usr/kettle/data-integration/config.properties(非必要,job执行过程中为指定config文件路径使用KETTLE_HOME变量)

3. 启动carte

cd /usr/kettle/data-integration/
nohub ./carte.sh pwd/carte-config-master-8080.xml &

启动完成后,可登录carte监控页面
http://ip:端口/kettle/status/ 
用户名:cluster
密码   : cluster

4. 提交任务

配置job子服务器,然后启动,即可在carte监控页面看到已经提交的任务



注意事项:

max_log_lines节点                      -》指定Carte中每个已经运行的转换或者作业的日志在内存中能够保存的最大行数。
max_log_timeout_minutes节点   -》指定Carte中每个已经运行的转换或作业生成的日志在内存中保留的时间,单位为分钟。超过指定时间的日志记录将被清除掉,防止Carte占用过多的内存空间。 建议生产环境适当地配置该值。对于使用频繁的Carte服务适当降低该值,防止Carte服务运行一段时间后占用的内存越来越多,避免出现OOM。
object_timeout_minutes节点      -》指定Carte中每个存在的转换或者作业对象在内存中保留的时间,单位为分钟。超过指定时间的这些对象将被清除,从而被Java GC回收,防止Carte占用过多的内存空间。建议生产环境适当地配置该值,以便Java GC能够回收多余的对象占用空间,减少系统内存使用。防止OOM。
一开始没设置这几个参数,服务运行一段时间后就OOM

任务执行方式
1 : 直接执行job,使用kettle自带定时调度   ./kitchen.sh /norep /file /usr/local/job/ssh/spark.kjb & 
2 : 使用linux定时机制调度job
3 : 使用carte远程提交任务到服务器


设置环境变量后,job中可以使用/data可以使用环境变量配置的路径,但是转换却不可以,原因暂时未知


任务执行模式
例如5分钟执行一次任务,启动后5分钟执行第一次任务,执行完成后以此时为起点再过五分钟执行任务


0时区问题

vi spooh.sh 添加-Duser.timezone=GMT+0,JavaScript转换时区问题,启动脚本设置gmt0时区


数据流中插入常量

kettle 从MongoDB导入数据到greenplum,如果greenplum表中需要添加mongodb表中没有的字段,解决方案 : 1 从mongodb获取数据流 2 :增加常量, 3 :将字段值设置为常量即可 4:插入greenplum


获取转换错误日志(记录到数据库)

在javaScript验证脚本中获取错误日志
var log = previous_result.getLogText();
log = log.replaceAll("'","-");
parent_job.setVariable("log","log");
true;

在job中获取前一个转换的日志,设置到job变量中


设置变量

转换中通过设置setVariable("task",task,"s"),就可以在job中获取到task的值


kettle连接mongodb失败,mongodb启动用户验证
解决办法:
vi data-integration\system\karaf\etc\config.properties
文件中下部有一行 org.osgi.framework.bootdelegation=(一堆参数)
在末尾处加上  ,javax.crypto,javax.crypto.*
保存即可


优化垃圾回收 

修改spoon.sh参数 由于job导出数据量大,加之jvm大数据直接进入老年代的特点

使用jstat -gcutil -h10 3828 1000观测,发现老年代full gc 频繁,所以做以下优化,减少full gc

vi spooh.sh  

-Xmx4g -Xms4g -Xmn256m -XX:MaxPermSize=256m -XX:PretenureSizeThreshold=20971520 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=85


以上为项目部署及运维中遇到的坑,欢迎拍砖



猜你喜欢

转载自blog.csdn.net/changyuan101/article/details/52232125