2016-08-22 11 views
1

Я хочу проверить, существует ли файл или нет, в местоположении HDFS с использованием партии oozie.Как получить имя файла динамически в узле решения в OOZIE?

В моем местоположении HDFS, в ежедневной базе я получаю файл типа «test_08_01_2016.csv», «test_08_02_2016.csv» на каждый день 11 вечера.

Так что я хочу проверить, существует ли файл после 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> 

Мы можем проверить файл существует или нет в данном HDFS месте с помощью fs:exists т.е.

${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 мы можем разл lare все статические значения, как показано ниже.

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. После успешного возврата 0 else 1. Исходя из этого переписывания успехов и ошибок в работе oozie ...

+0

Для записи, тот же пользователь задал очень похожий на вопрос несколько дней назад и получил действительный ответ (http://stackoverflow.com/questions/39033693/how-to-check-whether-the-file-is-exist-in-hdfs-location-using-oozie-batch). –