oozie中管理datax脚本方法实践

Posted 莫莫绵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oozie中管理datax脚本方法实践相关的知识,希望对你有一定的参考价值。

oozie中管理datax脚本方法实践

--------------------------------------------------------------莫莫绵来了-----------------------------------------------------------

写在前面

  1. 使用CDH 6.3.2 oozie 5.1.0 datax 3.0

遇见问题

    项目中往往会有很多离线同步任务,比如从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.timezone</name><value>GMT+0800</value><description>使用oozie的时候需要设置时区</description></property>
<property><name>oozie.action.max.output.data</name><value>204800</value><description> </description></property>
<property><name>oozie.servlet.CallbackServlet.max.data.len</name><value>1048576</value><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 name@xxx.xx

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不执行。我又哭了。。。。唉。先写到这吧。

--------------------------------------------------------------莫莫绵走了-----------------------------------------------------------


水平有限,如果你觉得上述有任何疑问、不足、错误的地方,欢迎在评论区指正。

以上是关于oozie中管理datax脚本方法实践的主要内容,如果未能解决你的问题,请参考以下文章

阿里云万亿级数据集成架构实践

罗海伟:阿里云万亿级数据集成架构实践

datax源码解析-任务拆分机制详解

datax源码解析-任务拆分机制详解

datax源码解析-启动类分析

DataX调优及常见问题