如何在OOZIE的决策节点中动态获取文件名?

时间:2016-08-22 14:07:32

标签: shell hadoop oozie cloudera-cdh oozie-coordinator

我想检查文件是否存在,使用oozie批处理在HDFS位置。

在我的HDFS位置,在每日基础中,我将获得类似" test_08_01_2016.csv"," test_08_02_2016.csv"每天晚上11点。

所以我想检查文件是否存在是在11.15 PM之后,我可以检查文件是否存在于不使用决策节点。通过使用以下工作流程。

<workflow-app name="HIVECoWorkflow" xmlns="uri:oozie:workflow:0.5">
<start to="CheckFile"/>
<decision name="CheckFile">
     <switch>
        <case to="nextOozieTask">
          ${fs:exists("/user/cloudera/file/input/test_08_01_2016.csv")}
        </case>
        <default to="MailActionFileMissing" />
     </switch>

<action name="MailActionFileMissing" cred="hive2">
    <hive2 xmlns="uri:oozie:hive2-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <jdbc-url>jdbc:hive2://quickstart.cloudera:10000/default</jdbc-url>
        <script>/user/cloudera/email/select.hql</script>
        <file>/user/cloudera/hive-site.xml</file>
    </hive2>
    <ok to="End"/>
    <error to="Kill"/>
</action>
<action name="nextOozieTask" cred="hive2">
    <hive2 xmlns="uri:oozie:hive2-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <jdbc-url>jdbc:hive2://quickstart.cloudera:10000/default</jdbc-url>
        <script>/user/cloudera/email/select1.hql</script>
        <file>/user/cloudera/hive-site.xml</file>
    </hive2>
    <ok to="End"/>
    <error to="Kill"/>
</action>


 <kill name="Kill">
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="End"/>

但我希望动态获取文件名,例如  &#34; filenamt_todaysdate i.e test_08_01_2016.csv&#34 ;.

请帮我解决这个问题,我怎样才能获得动态文件名。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

上述问题的解决方案是,我们必须在协调工作中从协调工作中获取日期值,如下面的代码。

<property>
    <name>today</name>
    <value>${coord:formatTime(coord:dateTzOffset(coord:nominalTime(), "America/Los_Angeles"), 'yyyyMMdd')}</value>
  </property>

我们可以使用帮助fs:exists

检查文件是否存在于给定的HDFS位置
${fs:exists(concat(concat(nameNode, path),today))}

在工作流程中,我们必须传递协调作业日期值“今天”的参数,如下面的代码

<workflow-app name="HIVECoWorkflow" xmlns="uri:oozie:workflow:0.5">
<start to="CheckFile"/>
<decision name="CheckFile">
     <switch>
        <case to="nextOozieTask">
          ${fs:exists(concat(concat(nameNode, path),today))}
        </case>
         <case to="nextOozieTask1">
          ${fs:exists(concat(concat(nameNode, path),yesterday))}
        </case>
        <default to="MailActionFileMissing" />
     </switch>  </decision>

<action name="MailActionFileMissing" cred="hive2">
    <hive2 xmlns="uri:oozie:hive2-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <jdbc-url>jdbc:hive2://quickstart.cloudera:10000/default</jdbc-url>
        <script>/user/cloudera/email/select.hql</script>
        <file>/user/cloudera/hive-site.xml</file>
    </hive2>
    <ok to="End"/>
    <error to="Kill"/>
</action>
<action name="nextOozieTask" cred="hive2">
    <hive2 xmlns="uri:oozie:hive2-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <jdbc-url>jdbc:hive2://quickstart.cloudera:10000/default</jdbc-url>
        <script>/user/cloudera/email/select1.hql</script>
        <file>/user/cloudera/hive-site.xml</file>
    </hive2>
    <ok to="End"/>
    <error to="Kill"/>
</action><kill name="Kill">
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="End"/>

在job.properties中,我们可以声明所有静态值,如下所示。

jobStart=2016-08-23T09:50Z
jobEnd=2016-08-23T10:26Z
tzOffset=-8
initialDataset=2016-08-23T09:50Z
oozie.use.system.libpath=True
security_enabled=False
dryrun=True
jobTracker=localhost:8032
nameNode=hdfs://quickstart.cloudera:8020
test=${nameNode}/user/cloudera/email1                
oozie.coord.application.path=${nameNode}/user/cloudera/email1/add-partition-coord-app.xml
path=/user/cloudera/file/input/ravi_

答案 1 :(得分:0)

可能是你可以编写一个shell脚本来执行hdfs文件检查。成功后返回0 else 1.基于此重写oozie工作流成功和错误节点...