oozie中管理datax脚本方法实践

  • @[TOC](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脚本方法实践相关推荐

  1. mixamo和ue小白人映射关系以及让mixamo绑定的人物在场景中运动的多种方法实践...

    ue中的root->Hips ue中 ik_foot_l ik_foot_r下面有foot_r 在mixamo下面leftfoot对应ik_foot_l 但是foot_l 只能给他对应leftT ...

  2. 【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )

    文章目录 一. Java 调用 C# 依赖库准备 1.依赖库位置 2.unityLibrary 依赖库位置 二. Java 调用 C# 的 UnityPlayer#UnitySendMessage 方 ...

  3. linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...

  4. Linux中常见软件安装方法及常见管理方法

    软件安装及管理 一.软件的类型 二.Tar包安装.升级.卸载(必须会) 三.RPM软件包安装及管理(必须会) 四.脚本安装.升级.卸载 五.SRPM包安装(知道就行,很少用) 一.软件的类型 1.软件 ...

  5. java 调用js脚本_Java中使用JavaScript脚本的方法步骤

    简介 Nashorn Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引 ...

  6. python中command是什么意思_python中command执行shell命令脚本方法

    在Python中有一个模块commands也很容易做到以上的效果. 看一下三个函数: 1). commands.getstatusoutput(cmd) 用os.popen()执行命令cmd, 然后返 ...

  7. object-c中管理文件和目录:NSFileManager使用方法

    object-c中管理文件和目录:NSFileManager使用方法 对于NSFileManager,文件或目录是使用文件的路径名唯一标识的.每一个路径名都是一个NSString对象,它可以是相对路径 ...

  8. 在c#中调用windows脚本的方法

    在c#中调用windows脚本的方法 方法1:直接调用   CODE:   System.Diagnostics.Process proc = new System.Diagnostics.Proce ...

  9. Linux中执行shell脚本的4种方法

    这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下. bash shell 脚本的方法有多种,现在作个小结.假设我们编写 ...

  10. c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法

    c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法 时间:2017-05-09 12:32:06阅读:234评论 ...

最新文章

  1. JavaWeb实现文件上传下载功能实例解析
  2. 【MatConvnet速成】MatConvnet图像分类从模型自定义到测试
  3. php strrchar,php文件上传
  4. SQLServer知识:sqlcmd用法笔记
  5. buck变换器设计matlab_一种用于Boost PFC变换器的改进关断时间控制策略
  6. 由Handle转换为控件
  7. java移动元素_如何通过箭头键连续/平滑地移动元素?
  8. 数据备份与数据恢复产品——程序猿的必备品
  9. python表示倍数的英语句型_英语中“倍数表达法”和“长、宽、高句型”
  10. java excel 冻结_如何实现表格的首行冻结2
  11. 标签打印软件如何制作医疗废物标签
  12. 根据书单来制作item2vec
  13. 小米之家真的是有效的渠道模式么?
  14. 我也就是尝试了一下斗图的快乐
  15. Python3 - pillow的基本用法(第三天)
  16. 全球与中国AI在智能手机和可穿戴设备中的应用市场深度研究分析报告
  17. 记录oracle的一些操作
  18. Python实现简易中国剩余定理(信安密码实验)
  19. 开发微信小程序:设置某个页面为启动后打开的第一个页面
  20. 相亲交友源码的架构设计,合成复用原则的实现

热门文章

  1. 网课题库API接口 对接教程
  2. mysql数据库基本知识点整理笔记
  3. Java面试之项目介绍
  4. MySQL字符串的拼接方法
  5. 使用纯文本方式编写软件设计文档
  6. 怎么做好企业网站关键词优化
  7. Python仿黑客帝国代码雨
  8. linux操作系统实用教程课后答案,Linux操作系统案例教程课后习题答案
  9. 小规模纳税人和一般纳税人的区别
  10. Postman系列番外篇 - postman web版介绍及与PC版的对比