Как динамически получить имя файла в узле решений в OOZIE?

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

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

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

пожалуйста, помогите мне в этом, как я могу получить динамическое имя файла.

заранее спасибо.


person Sai    schedule 22.08.2016    source источник
comment
RTFM =› oozie.apache.org/docs /4.1.0/   -  person Samson Scharfrichter    schedule 22.08.2016


Ответы (2)


Решение для вышеуказанного вопроса заключается в том, что мы должны получить значение даты из задания координации, как показано ниже, внутри задания координации.

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

in job.properties we can declare all static values like below.

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_
person Sai    schedule 23.08.2016

Может быть, вы можете написать сценарий оболочки, который проверяет наличие файла hdfs. В случае успеха верните 0, иначе 1. На основе этого перепишите узел успеха и ошибки рабочего процесса oozie...

person Despicable me    schedule 22.08.2016
comment
Для справки, тот же пользователь задал очень похожий вопрос несколько дней назад и получил действительный ответ (stackoverflow.com/questions/39033693/). - person Samson Scharfrichter; 22.08.2016