2016-08-22 33 views
1

我想检查文件是否存在,在HDFS位置使用oozie批处理。如何在OOZIE的决策节点中动态获取文件名?

在我的HDFS位置,在日常的基础上,我将在每天晚上11点获得像“test_08_01_2016.csv”,“test_08_02_2016.csv”这样的文件。

所以我想检查文件是否存在是晚上11点15分,我可以检查文件存在不使用决策节点。通过使用以下工作流。

<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"/> 

,但我想动态获取文件名,例如像 “filenamt_todaysdate i.e test_08_01_2016.csv”。

请帮我关于这个如何获得文件名动态。

在此先感谢。

+0

RTFM => https://oozie.apache.org/docs/4.1.0/CoordinatorFunctionalSpec.html#a6.7.3._coord:nominalTime_EL_Function –

回答

1

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

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

我们可以检查文件的帮助fs:exists

${fs:exists(concat(concat(nameNode, path),today))} 

存在或不给予HDFS位置和工作流程,我们必须通过协调工作日期值的参数“今天”像下面job.properties代码

<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"/> 

我们可以十二月拉下所有静态值如下。

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_ 
0

也许你可以编写一个hdfs文件存在检查的shell脚本。一旦成功返回0其他1.基于这个重写oozie工作流成功和错误节点...

+0

为了记录在案,同一用户问了一个非常类似的问题一几天前,并得到了一个有效的答案(http://stackoverflow.com/questions/39033693/how-to-check-whether-the-file-is-exist-in-hdfs-location-using-oozie-batch)。 –

相关问题