Как я могу использовать свойство конфигурации рабочего процесса Oozie в самом рабочем процессе?

У меня есть координатор Oozie, который следит за появлением файла в определенном каталоге. Этот координатор работает ежедневно. Если просматриваемый файл появляется, запускается рабочий процесс.

Рабочий процесс принимает параметр отслеживаемого файла/каталога. Узи передает это ему. Это полный путь (например, hdfs://myhost/dir1/dir2/2015-02-17).

Мне нужно взять /dir1/dir2/2015-02-17 и передать его в сценарий Hive, который, похоже, не использует полный путь HDFS. Это означает, что мне нужно использовать функцию Workflow EL, чтобы удалить часть hdfs://myhost. Я думаю, replaceAll() сделает это. Проблема заключается в передаче результата этого в Hive.

Есть ли способ использовать свойство конфигурации рабочего процесса в самом рабочем процессе?

Например, я хочу иметь возможность использовать «dateToProcess», который является частью имени каталога, который является входом в рабочий процесс:

  <workflow-app name="mywf" xmlns="uri:oozie:workflow:0.4">
  <parameters>
    <property>
       <name>region</name>
    </property>
    <property>
       <name>hdfsDumpDir</name>
    </property>
    <property>
      <name>hdfsWatchDir</name>
      <value>${nameNode}${watchDir}</value>
    </property>
  </parameters>

  <start to="copy_to_entries"/>
  <action name="copy_to_entries">
    <hive xmlns="uri:oozie:hive-action:0.2">
      <job-tracker>${jobTracker}</job-tracker>
      <name-node>${nameNode}</name-node>
      <job-xml>hive-site.xml</job-xml>

      <configuration>
        <property>
          <name>mapred.job.queue.name</name>
          <value>${queueName}</value>
        </property>
        <property>
          <name>dateToProcess</name>
          <value>${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</value>
        </property>
      </configuration>

      <script>myhivescript.q</script>
      <!--
           Parameters referenced within Hive script.
      -->
      <param>INPUT_TABLE=dumptable</param>
      <param>INPUT_LOCATION=${watchDir}/${wf:conf('dateToProcess')}</param>
    </hive>
    <ok to="cleanup"/>
    <error to="sendEmailKill"/>
  </action>
  ...
  </workflow>

Я получаю пустую строку, когда использую $wf:conf('dateToProcess'). Я получаю, что переменная не найдена, когда я использую ${dateToProcess}.

Любые идеи?


person Shinta Smith    schedule 18.02.2015    source источник


Ответы (1)


Удалять

    <property>
      <name>dateToProcess</name>
      <value>${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</value>
    </property>

и вместо этого поместите его значение непосредственно в <param>, т.е.

  <param>INPUT_LOCATION=${watchDir}/${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</param>

Если вы собираетесь использовать это более чем в одном месте, добавьте свойство dateToProcess к config-default.xml, и тогда оно будет доступно, как вы и предполагали.

person Ben Watson    schedule 18.02.2015