无法使用 getopts 将选项传递给 oozie shell 操作

Unable to Pass option using getopts to oozie shell Action

我在 shell 中创建了一个脚本,并在我的脚本中使用 getopts 方法传递参数,如下所示:

sh my_code.sh -F"file_name"

其中 my_code.sh 是我的 unix 脚本名称,file_name 是我使用 getopts 传递给我的脚本的文件。

当我从命令行调用我的脚本时,这工作正常。
我想通过 oozie 调用相同的脚本,但我不确定我该怎么做。

我尝试将参数传递给 "exec" 以及 xml

中的 "file" 标记

当我尝试在 exec 标记中传递参数时,它给出了 "JavaNullPoint" 预期

执行标签

<exec>my_code.sh -F file_name</exec>

文件标签

<file>$/user/oozie/my_code.sh#$my_code.sh -F file_name</file>

当我尝试在文件标签中传递参数时,出现错误,"No such File or directory"。它正在 /yarn/hadoop 目录中搜索 file_name。

任何人都可以建议我如何使用 oozie 实现这一点吗?

您需要创建一个 lib/ 文件夹作为您工作流程的一部分,Oozie 将在其中上传脚本作为其流程的一部分。此目录也应上传到 oozie.wf.application.path 位置。

之所以需要这样做是因为 Oozie 会 运行 在任何随机 YARN 节点上,并假装你有一百个节点集群,否则你必须确保每个服务器都有 /user/oozie/my_code.sh 文件可用(当然很难跟踪)。当这个文件可以放在 HDFS 上时,每个节点都可以在本地下载它。

因此,如果您将脚本放在您提交的工作流程 xml 旁边的 lib 目录中,那么您可以直接按名称引用脚本,而不是使用 # 语法

然后,您需要为 opts

使用 argument xml 标签

https://oozie.apache.org/docs/4.3.1/DG_ShellActionExtension.html

我已经创建了 lib/ 文件夹并将其上传到 oozie.wf.application.path 位置。

我可以将文件传递给我的 shell 操作。