如何在oozie中创建/声明全局变量?

时间:2016-10-12 19:03:34

标签: hadoop sqoop oozie

我正在创建一个oozie worklow,我需要有多个shell操作,但我面临的问题是,对于我在工作流程中的每个shell操作,我必须声明一个环境变量,这意味着如果我有10个shell动作我需要声明10次,我的问题是:如果有任何方式我可以声明/创建全局变量以避免重复变量做同样的事情吗?

示例:

https://([^/]*)/(.*)

我的script1.sh期待一个名为user_name的参数,我已将其声明为job.properties,但它在我的工作流程中无效我错过了参数用户名

我想知道如何从全局配置文件

向shell脚本发送参数

由于

2 个答案:

答案 0 :(得分:0)

我无法创建全局参数以便将值传递为:user&密码,HADOOP_USER_NAME(在我看来),但我能够使用shell脚本来解决它,所以在shell中我为我的提议定义了以下参数:

export HADOOP_USER_NAME=admin;
connection=$(hdfs dfs -cat /user/connection.txt)

其中connection.txt包含连接字符串的所有信息 然后使用sqoop我在shell文件中以这种方式传递信息:

sqoop $connection --table test --target-dir /user/hive/warehouse/Jeff.db/test/ --m 1 --delete-target-dir

并且通过这种方式我能够解决我的问题,我必须声明一些全局变量,但这些是使用&并行执行sqoop所必需的。

答案 1 :(得分:0)

无法将全局参数传递给shell操作。 globals部分仅适用于属性。有关详细信息,请参阅此问题的答案: OOZIE: properties defined in file referenced in global job-xml not visible in workflow.xml

要在shell操作中传递参数/变量,您可以通过shell操作将这些值作为 arguments 传递(您仍然可以在job.properties文件中声明它们:

<action name="shell-<name>">
  <shell xmlns="uri:oozie:shell-action:0.3">
    <exec>script1.sh</exec>
    <argument>${user_name}</argument>
    <argument>${database}</argument>
    <argument>${etc}</argument>
    <file>/user/hive/script1.sh#script1.sh</file>
  </shell>
    <ok to="End"/>
    <error to="Kill"/>    
</action>

在你的shell脚本中,你可以像这样调用这些变量:

#!/bin/bash -e
user_name=${1}
database=${2}
etc=${3}
<your shell commands>

然后您可以在shell脚本中使用这些变量。你也可以只用$ 1,$ 2等,但为了便于阅读,最好先给你的参数命名。

为了防止向每个shell操作传递大量参数,您还可以使用所有这些参数向shell操作添加config file,并将该文件导入实际的shell脚本中:

<action name="shell-<name>">
  <shell xmlns="uri:oozie:shell-action:0.3">
    <exec>script1.sh</exec>
    <file>/user/hive/script1.sh#script1.sh</file>
    <file>/user/hive/CONFIG_FILE</file>
  </shell>
    <ok to="End"/>
    <error to="Kill"/>    
</action>

shell脚本:

#!/bin/bash
. CONFIG_FILE

<your shell commands>