【新手入门】Oozie workflow如何在action之间传递参数
接觸oozie時間并不長,半個月有余,對其十分好用的action管理模式以及各種工作流控制欲罷不能,可惜中文的文檔真心少。
上周發現了這樣一個問題,雖然說oozie workflow很方便工作流的建立和控制,但是oozie的參數大多定義在job.properties中,然后一次性載入oozie環境中,在runtime下很難在各個action之間傳遞參數,所以相比于python和shell script版的pipeline, 參數的傳遞著實不方便,去查詢官網oozie文檔,查了網上一些解答,下面直接上代碼,新手入門級,大大們見諒。
job.properties
# Cluster settings nameNode=hdfs://sandbox:8020 jobTracker=sandbox:50300appName=var_demooozie.use.system.libpath=true oozie.wf.application.path=${nameNode}/user/${user.name}/${appName}/ oozie.libpath=/user/oozie/share/lib oozie.wf.rerun.failnodes=true queueName=defaultworkflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.4" name="cip_poi_etl_workflow"> <start to="get_var"/><action name="get_var"><shell xmlns="uri:oozie:shell-action:0.1"><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>${queueName}</value></property></configuration><exec>input.sh</exec><file>input.sh</file><capture-output/> </shell><ok to="use_var" /><error to="send_email" /></action><action name="use_var"><shell xmlns="uri:oozie:shell-action:0.1"><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>${queueName}</value></property></configuration><exec>output.sh</exec><argument>${wf:actionData('get_var')['var']}</argument><file>output.sh</file></shell><ok to="end" /><error to="send_email" /></action><action name="send_email"><email xmlns="uri:oozie:email-action:0.1"><to>${emailTo}</to><subject>Status of workflow ${wf:id()}</subject><body>The workflow ${wf:id()} had issues and was killed. The error message is: ${wf:errorMessage(wf:lastErrorNode())}</body></email><ok to="fail"/><error to="fail"/></action><kill name="fail"><message>Failed, Error Message[${wf:errorMessage(wf:lastErrorNode())}]</message></kill><end name="end"/> </workflow-app>input.sh
echo var=var_test_resultoutput.sh hadoop fs -mkdir /user/hue/$1
注意兩個地方:
? ? ? ? ?<capture-output/> :它的作用是是告訴oozie,這個action的輸出要被oozie運行存儲下來。
${wf:actionData('get_var')['var']}: 它的作用是說我要調用“get_var”這個action捕捉到的那個輸出的其中一個參數。
然后就能實現相互傳遞參數了。
唯一需要注意的一點是,capture-output 中的結果必須是java property 格式,例如上面例子中的:var=var_test_result
這個只是個簡單的傳遞參數的例子,當然你也可以寫一個java class,py class,甚至hive結果,要求很簡單,只要你的輸出是上面這個格式的,oozie就能找到并使用。
總結
以上是生活随笔為你收集整理的【新手入门】Oozie workflow如何在action之间传递参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES数据同步方案
- 下一篇: COSCon'22 元宇宙参会指南来啦!