我正在创建一个oozie worklow,我需要有多个shell操作,但我面临的问题是,对于我在工作流程中的每个shell操作,我必须声明一个环境变量,这意味着如果我有10个shell动作我需要声明10次,我的问题是:如果有任何方式我可以声明/创建全局变量以避免重复变量做同样的事情吗?
示例:
https://([^/]*)/(.*)
我的script1.sh期待一个名为user_name的参数,我已将其声明为job.properties,但它在我的工作流程中无效我错过了参数用户名
我想知道如何从全局配置文件
向shell脚本发送参数由于
答案 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>