win7下借助kettle7.0在命令行界面将数据传输到hdfs

 为什么写这系列博客的原因就是真的遇到的坑太多了,所以需要写下来,防止以后忘记,话不多说吗,直接进入主题

一、环境

  • kettle7.0,kettle是开源的etl工具(kettle7.0需要java8),其优势在于可以使用图形化界面开发,开发完成后可以部署在linux或者windows平台
  • window7.0
  • 大数据平台采用的是CDH,其余版本的haoop应该也是类似的

二、修改配置文件

  • 将集群中的haoop配置文件拷贝到kettle的安装文件夹下,例如D:\kettle\pdi-ce-7.0.0.0-25\data-integration(安装路径)\plugins\pentaho-big-data-plugin\hadoop-configurations\cdh58(haddop版本),需要拷贝的配置文件如下: 

 

  • 因为hdfs存储文件有所有者和组的概念,提交MR作业的时候会先从环境变量读取HADOOP_USER_NAME参数来识别文件的所有者,如果没有,则读取系统用户,一般操作hadoop集群都会新建用户,所以建议设置环境变量HADOOP_USER_NAME=hdfs(hadoop专用用户名,根据自己定义的名字修改),环境变量如下:

 因为涉及到跨平台提交MR作业,需要在mapred-site.xml文件里加上如下参数(注意:不是所有的hadoop版本都有,好像是hadoop2.×之后,低版本的得自己改一下源码,主要是因为不同系统环境变量的表示方法不一样,windows是%AA%,Linux是$AA),如果不加,会报错,具体错误我没记录,和appMaster有关,改动的地方如下:

<property>  
  <name>mapreduce.app-submission.cross-platform</name>  
  <value>true</value>  
</property> 

 三、使用kettle传输数据到hdfs

  • 双击D:\kettle\pdi-ce-7.0.0.0-25\data-integration(安装路径)下的Spoon.bat(linux对应.sh),启动ketlle的图形化界面,如下:

 

  • 配置集群信息
    新建kettle作业(注意是作业,kettle有作业和转换两种任务文件,转换类似与子任务,转换内的步骤是并行执行,作业是严格按照定义的工作流执行,所以如果不同步骤之间有严格以来,则需要使用作业来控制),在作业下的Hadoop Cluster子目录点击鼠标邮件,新建集群,会弹出集群配置对话框,填写对应信息,如下:

 

  • 测试集群连接是否正常,配置好集群信息,点击测试按钮,测试是否可以正常连接到集群,如果信息都填写正确,并且集群是健康的,测试界面应该如下,根据相应的错误修改即可,因为没用Oozie,所以我忽略Oozie相关的错误:

 

  • 开发kettle作业
    因为只是文件上传,所以只要增加开始和Haddop Copy Files两个组件即可,如下图

 

  • 双击Haddop Copy Files进行配置,包括待上传的文件所在的路径,集群信息,如下图,注意文件路径采用URI的方式标识,本地文件系统的开头是file:///D:,有三个斜杠。正常情况下,开发和生产的环境肯定不一样,这种方式设置的目标路径是固定的,不支持动态配置,所以还可以有如下写法,这样就可以把集群NameNode的信息配置在配置文件里,上线投产改一下配置文件即可,设置子菜单栏的功能可以根据需要选择。

 

  • 配置好后点击左上方的运行按钮,只要配置正确,运行情况会如下图

 

  • 从浏览器登录hdfs,可以看到文件已经上传至hdfs,如下

 四、别高兴太早

 

  • 经过之前的介绍,是不是觉得很容易,有点小激动,但是在开始的时候我就说过生产环境,kettle作业一般都是通过脚本启动,在安装目录下有一个名为Kitchen.bat(kitchen.sh)的脚本用于启动和执行kettle作业,Window和Linux的命令行书写范式不同,主要是参数的书写形式不同,如下:
    Windows(安装路径)/Kitchen.bat /norep /file=kettle作业路径 "/param:key1=value1" "/param:key2=value2"……(每个参数[/param]都要用双引号包起来)
    Linux(安装路径)/kitchen.sh -norep -file= kettle作业路径 -param:key1=value1 -param:key2=value2……
  • 打开windows的命令行界面,输入命令,执行作业,会出现以下情况: 可以看到命令行输出如下信息,作业正常运行

没有报错,当你开心的打开浏览器查看文件是否被上传时,简直不敢相信自己的眼睛,文件竟然不见了,不见了!!!!!!如下图,没有Chinese.lang文件 

 五、解决方案

这个问题的解决完全是运气,因为没有任何报错信息,曾经一想通过源码解决这个问题,但是之后一天早上,因为kettle会为每个作业创建缓存,类似于jvm的工作空间,路径在(安装路径)/system/karaf/caches,为了防止缓存过多影响作业的运行,我删除了缓存文件夹的内容,然后重新使用命令行启动作业,文件竟然拷贝过去了,命令行输出如下:日志内容多了很多,打开浏览器,可以看到文件已经被上传到hdfs,如下图但是对于要自动运行的kettle作业,这种手动删除的操作有点太low了,我看了Kitchen.bat这个脚本,发现其最后调用的也是Spoon.bat,又研究了一下Spoon.bat,发现可以设置命令行参数,我觉得一定可以禁掉缓存,果然,找了半天,发现可以通过增加参数来禁止缓存,在Spoon.bat里,找到Set OPT对应的行,如下图在结尾处增加如下参数

 



"-Dpentaho.karaf.root.copy.dest.folder=缓存路径"
"-Dpentaho.karaf.root.transient=true"
设置好后,kettle就不会存储缓存信息,鉴于我还不是很清楚缓存的作用,建议重写Kitchen脚本,将缓存路径和是否删除作为参数传入,一般的作业调用存储缓存的Kitchen.bat,大数据相关的作业抵用删除缓存的脚本,写法可以参考如下:
@echo off
setlocal
SET initialDir=%cd%
pushd %~dp0
SET STARTTITLE="Kitchen"
SET SPOON_CONSOLE=1
set PENTAHO_KARAF_ROOT=缓存路径
set PENTAHO_KARAF_ROOT_DELETE=false(是否删除)
call Spoon1.bat %PENTAHO_KARAF_ROOT% %PENTAHO_KARAF_ROOT_DELETE% -main org.pentaho.di.kitchen.Kitchen -initialDir "%initialDir%"\ %*
popd

六、写在后面的话

经过测试,kettle6.0并没有这个问题,这应该是kettle7.0的bug,或者是大数据插件的bug

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值