--------------------------------------------------------------莫莫绵来了-----------------------------------------------------------
项目中往往会有很多离线同步任务,比如从mysql每天凌晨同步昨日数据到hive中。这些离线任务的执行使用datax是一个很好的选择(因为它真的快)。一般来说最初可以使用crontab的方式来启定时任务,执行脚本跑datax job。但是这种方法有一个问题,没法做流程化。比如A-job 执行完才能执行B-job。但是我并不确定A-job什么时候执行完,使用crontab也只能做如下:
30 0 * * * source /etc/profile; /bin/bash /home/datax/script/a.sh
30 2 * * * /bin/bash /home/datax/script/b.sh
这种就是我估计a脚本两个小时执行完没问题。但是考虑到很多情况,可能会发生a并没有执行或出错或没有执行完,就执行b带来的各种问题。
为此我们需要一个管理任务的框架。
而我一个考虑的是迁移的成本问题。尽管有很多开源框架很优秀。但是我们大数据系统使用了CDH。里面就有个现成
的工具:oozie。
解决问题的最好方法就是恰好没有问题,其次是我恰好已经有了一个现成的工具可以完成它。
由于之前是通过crontab执行脚本的方式来管理的。最简单的方法就是啥都不动,只把crontab的配置改到oozie上就好(当然这可能是对于我最简单的方法)。
于是网上的很多方案就都可以排除。最终我选择使用oozie的ssh-action来处理。直接ssh到之前datax安装的节点上,执行之前的脚本即可。
这种方法的好处:
1:迁移成本低,操作简单,不需要把shell脚本放入hdfs,不需要把datax塞到hdfs,不用配一大堆oozie的job。
2:完成了流程式调用,解决了crontab带来的问题。
1:CDH中安装部署好oozie,配好配置,启动
<property><name>oozie.processing.timezonename><value>GMT+0800value><description>使用oozie的时候需要设置时区description>property>
<property><name>oozie.action.max.output.dataname><value>204800value><description> description>property>
<property><name>oozie.servlet.CallbackServlet.max.data.lenname><value>1048576value><description>Max size in characters for the action completion data output. description>property>
2:hue中配置使用oozie
3:hue中创建workflow
3:创建定时任务
4:运行
5:脚本部分内容参考:
#!/bin/bash
source /etc/profile;
echo "$(date +%Y%m%d)_$(date +%H%M%S) - 开始迁移"
setVar=" -DmysqlIp='xxx:xxx'"
python /home/datax/datax/bin/datax.py -p "$setVar" /home/datax/mysqltomysql/xxx.json
echo "$(date +%Y%m%d)_$(date +%H%M%S) - 结束迁移"
1:cdh安装oozie中的问题:
报错:Failed to install Oozie ShareLib
上载 Oozie 共享库 Command aborted because of exception: Command timed-out after 270 second)
解决:其实看报错就是这个基础服务没装好而已。服务器上安装libxslt服务即可:
yum install libxslt-devel -y
2:因为要是用ssh功能,所以要打通所有oozie用户到datax脚本所在服务器用户的ssh
su oozie
ssh-keygen
ssh-copy-id [email protected]
linux下su oozie切换用户发现提示This account is currently not available
使用/etc/passwd 发现这个oozie用户后面是 “/sbin /nologin”,需要将起改成“/bin/bash”就好了
3:修改hue的时区
Time Zone为:Asia/Shanghai
4:修改oozie的时区
,oozie-site.xml配置项中增加如下配置:(cm中oozie搜索oozie-site.xml)
oozie.processing.timezoneGMT+0800
5:报错:org.apache.oozie.action.hadoop.LauncherException: Output data exceeds its limit
可以把oozie的输出限制加大:
Oozie-site.xml中,重启Oozie服务生效:oozie.action.max.output.data204800
6:java.lang.IllegalArgumentException: stream exceeds limit [2,048]
在oozie-site.xml中修改以下值
<property>
<name>oozie.servlet.CallbackServlet.max.data.len</name>
<value>2048</value>
<description>
Max size in characters for the action completion data output.
</description>
</property>
7: 执行oozie任务的时候datax命令那行死活执行不成功,只显示下面这两行信息就停了。
·DataX=(DATAX-OPENSOURCE-3.0), From Alibaba ! Copyright=© 2010-2017, Alibaba Group. All Rights Reserved.
解决方案:于是我自己在服务器的oozie用户上手动执行了 ssh datax@xxx ‘/bin/bash /home/datax/a.sh’
之后发现报错了,/bin/sh: java: command noe found .
查看了这是因为环境变量的问题,在脚本开头加个source /etc/profile; 就解决了。
source /etc/profile;
这个做的时候,卡在问题7这里卡了很久,因为手动执行脚本datax可以执行,但是用oozie就不行,一直以为是oozie不让datax启动新的job进程的问题,还看了datax源码。然后居然就是一个环境变量的问题。因为没有输出啥错误日志,哭死我了,最后是手动模拟执行ssh才有问题的报错信息。还有一个问题就是,如果脚本里没有echo的输出语句,任务最后会执行成功但是显示kill。导致后面的work-flow不执行。我又哭了。。。。唉。先写到这吧。
--------------------------------------------------------------莫莫绵走了-----------------------------------------------------------