如何在工作流本身中使用 Oozie 工作流配置 属性?
How can I use Oozie workflow configuration property in the workflow itself?
我有一个 Oozie 协调器,它监视文件是否出现在特定目录中。该协调员每天运行。如果正在观看的文件出现,则会启动工作流程。
工作流采用正在观看的 file/directory 的参数。 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} 时找不到变量。
有什么想法吗?
移除
<property>
<name>dateToProcess</name>
<value>${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</value>
</property>
而是将其值直接放入 <param>
即
<param>INPUT_LOCATION=${watchDir}/${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</param>
如果您打算在多个地方使用它,请将 dateToProcess
属性 添加到 config-default.xml
,然后它将按您的预期使用。
我有一个 Oozie 协调器,它监视文件是否出现在特定目录中。该协调员每天运行。如果正在观看的文件出现,则会启动工作流程。
工作流采用正在观看的 file/directory 的参数。 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} 时找不到变量。
有什么想法吗?
移除
<property>
<name>dateToProcess</name>
<value>${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</value>
</property>
而是将其值直接放入 <param>
即
<param>INPUT_LOCATION=${watchDir}/${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</param>
如果您打算在多个地方使用它,请将 dateToProcess
属性 添加到 config-default.xml
,然后它将按您的预期使用。