oozie中管理datax脚本方法实践
oozie中管理datax腳本方法實踐
- @[TOC](oozie中管理datax腳本方法實踐)
- 寫在前面
- 遇見問題
- 解決方法
- 步驟
- 處理實踐中的問題
- 最后
- @[TOC](oozie中管理datax腳本方法實踐)
- 寫在前面
- 遇見問題
- 解決方法
- 步驟
- 處理實踐中的問題
- 最后
--------------------------------------------------------------莫莫綿來了-----------------------------------------------------------
寫在前面
遇見問題
? ? 項目中往往會有很多離線同步任務,比如從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服務即可:
2:因為要是用ssh功能,所以要打通所有oozie用戶到datax腳本所在服務器用戶的ssh
su oozie ssh-keygen ssh-copy-id name@xxx.xxlinux下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; 就解決了。
最后
? ? 這個做的時候,卡在問題7這里卡了很久,因為手動執行腳本datax可以執行,但是用oozie就不行,一直以為是oozie不讓datax啟動新的job進程的問題,還看了datax源碼。然后居然就是一個環境變量的問題。因為沒有輸出啥錯誤日志,哭死我了,最后是手動模擬執行ssh才有問題的報錯信息。還有一個問題就是,如果腳本里沒有echo的輸出語句,任務最后會執行成功但是顯示kill。導致后面的work-flow不執行。我又哭了。。。。唉。先寫到這吧。
--------------------------------------------------------------莫莫綿走了-----------------------------------------------------------
水平有限,如果你覺得上述有任何疑問、不足、錯誤的地方,歡迎在評論區指正。
總結
以上是生活随笔為你收集整理的oozie中管理datax脚本方法实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ueditor编辑器的使用
- 下一篇: 电脑后台,电脑后台程序太多如何清理 -