将表名从文件传递到oozie工作流

时间:2017-04-25 18:33:18

标签: hadoop hdfs oozie oozie-coordinator

我在oozie中有一个工作流程。在这个工作流程中,我想传递一个表名作为参数。表名存在于文件tables.txt中 我想将表名从tables.txt传递给工作流程。

<workflow-app name="Shell_test" xmlns="uri:oozie:workflow:0.5">
<start to="shell-8f63"/>
<kill name="Kill">
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="test_shell">
    <shell xmlns="uri:oozie:shell-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <exec>shell.sh</exec>
        <argument>${table}</argument>
        <env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
        <file>/user/oozie/lib/test_shell.sh#shell.sh</file>
        <file>/user/oozie/input/tables.txt#tables.txt</file>
    </shell>
    <ok to="End"/>
        <error to="email-error"/>
    </action>
    <action name="email-error">
    <email xmlns="uri:oozie:email-action:0.2">
        <to>xxxxxxxxxx.com</to>
        <subject>Status of workflow ${table}</subject>
        <body>The workflow ${table} ${wf:id()} had issues and was killed. The error message is: ${wf:errorMessage(wf:lastErrorNode())}</body>
        <content_type>text/plain</content_type>
    </email>
    <ok to="end"/>
    <error to="end"/>
    </action>
    <end name="End"/>
</workflow-app>

我能够在工作流程中使用以下内容完成此操作。

<argument>${input_file}</argument>
<env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
<file>/user/oozie/lib/test_shell.sh#shell.sh</file>
<file>/user/oozie/input/${input_file}#${input_file}</file>

现在我遇到了问题。

说如果input_file中的某个表的工作流失败,那么我没有收到任何电子邮件。仅当input_file中的最后一个表的工作流失败时,我才会收到电子邮件。

为什么会发生这种情况?每次工作流程失败时如何收到电子邮件?

或者我在整个过程中做错了。

任何人都可以解释并纠正我在哪里以错误的方式做事。

我的test_shell.sh

while read line ;do 
     spark-submit --name "SparkJob" --master "yarn-client" test.py $line 
done < tables.txt 

1 个答案:

答案 0 :(得分:0)

Shell操作不会表现为shh操作,因为shell操作工作流将在其中一个数据节点上运行,它将脚本错误视为警告,除非您在脚本中执行退出1 。在失败时接收电子邮件的另一种方法是使用脚本中的电子邮件实用程序,在执行退出1 echo 'script X returned an error due to some reason; Please check the workflow for validation' | mailx -r oozie -s 'SUBJECTTOEMAIL' email@someemail.com之前使电子邮件实用程序从数据节点工作以确保您的数据节点已安装电子邮件实用程序。如果没有安装,你可以在边缘节点的电子邮件部分上执行ssh,看起来像这样ssh -o StrictHostKeyChecking=no ${edgeUser}@${edgeHost} "echo 'script X returned an error due to some reason; Please check the workflow for validation' | mailx -r oozie -s 'SUBJECTTOEMAIL' email@someemail.com"

我可以建议您对工作流程进行一些更改,以便在反映错误和利用工作流程中的电子邮件操作方面为您提供更好的结果

不要从shell操作本身调用配置文件,而是可以执行以下操作

<workflow-app name="Shell_test" xmlns="uri:oozie:workflow:0.5">
<start to="shell-8f63"/>
<kill name="Kill">
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="test_shell">
    <shell xmlns="uri:oozie:shell-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <exec>shell.sh</exec>
        <env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
        <file>/user/oozie/lib/test_shell.sh#shell.sh</file>
        <file>/user/oozie/input/tables.txt</file>
    </shell>
  

如果您注意到我对您的工作流所做的更改,我只是将tables.txt作为文件调用,而不是通过删除#tables.txt

将其作为执行实际执行

当你这样做时,shell动作会实际复制该文件并存储在它正在运行的容器中,所以为了利用table.txt配置文件,你将在脚本中调用. ./tables.txt因为容器已经复制,所以你可以像在主目录中那样调用tables.txt。

希望这会帮助你...... !!!如果您对我建议的解决方案有任何疑问,请发表评论。