使用Oozie运行shell脚本

时间:2013-12-06 04:32:08

标签: oozie

我正在尝试通过Oozie运行sh脚本,但我遇到了一个问题:

  

无法运行程序“script.sh”(在目录中   “/ mapred /本地/的TaskTracker /戴尔/ jobcache / job_201312061003_0001 / attempt_201312061003_0001_m_000000_0 /工作”):   java.io.IOException:error = 2,没有这样的文件或目录。

请帮我完成必要的步骤。

9 个答案:

答案 0 :(得分:7)

这个错误真的很模糊。以下是一些帮助我解决此问题的问题。

- 如果您在kerberized集群上运行oozie工作流,请确保通过将Kerberos Keytab作为参数传递进行身份验证:

...
<shell>
  <exec>scriptPath.sh</exec>
  <file>scriptPath.sh</file>
  <file>yourKeytabFilePath</file>
</shell>
...

- 在你的shell文件(scriptPath.sh)中,确保删除第一行shell引用。

#!usr/bin/bash

实际上,如果未在所有数据节点上部署此shell引用,则可能导致此错误代码。

答案 1 :(得分:3)

我有同样的问题,因为有些傻事。我在工作流程中添加了 shell块,然后我选择了相应的sendMail.sh,但我忘了在 FILE +中添加sendMail.sh文件。

enter image description here

答案 2 :(得分:1)

workflow.xml:

...
<shell>
  <exec>script.sh</exec>

  <file>scripts/script.sh</file>
</shell>
...

确保在hdfs中的同一文件夹中有脚本/ script.sh。

答案 3 :(得分:1)

Oozie shell操作在随机Hadoop节点上执行,即不在运行Oozie服务器的机器上本地执行。正如Oleksii所说,您必须确保您的脚本位于执行作业的节点上。

请参阅以下执行shell操作和ssh操作的完整示例:

https://github.com/airawat/OozieSamples/tree/master/oozieProject/workflowShellAction https://github.com/airawat/OozieSamples/tree/master/oozieProject/workflowSshAction

答案 4 :(得分:1)

尝试提供HDFS的完整路径,如

<exec>/user/nathalok/run.sh</exec>  
<file>/user/nathalok/run.sh#run.sh</file> 

并确保在job.properties中为库提供了正确的路径workflow.xml

oozie.libpath=hdfs://server/user/oozie/share/lib/lib_20150312161328/oozie
oozie.wf.application.path=hdfs://bcarddev/user/budaledi/Teradata_Flow

答案 5 :(得分:1)

如果你的shell文件存在于项目相关的dir中。那么它的shell文件格式会导致此错误。你需要使用dos2linux将dos的格式转换为linux:dos2linux xxxx.sh

答案 6 :(得分:0)

除了其他人所说的,这也可能是由于shell脚本有错误的行结尾(例如Windows的CRLF)。至少这件事发生在我身上:))

答案 7 :(得分:0)

还要确保shell脚本符合UNIX。如果这些shell脚本是在Windows环境中编写的,那么它会追加特定于Windows的行尾(EOL),并且oozie无法识别这些脚本。所以你会在oozie shell动作中找到“没有找到这样的文件或目录”。

答案 8 :(得分:0)

workflow.xml看起来像这样

<workflow-app name="HiveQuery_execution" xmlns="uri:oozie:workflow:0.5">
<start to="shell-3c43"/>
<kill name="Kill">
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="shell-3c43">
    <shell xmlns="uri:oozie:shell-action:0.1">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
        <exec>/user/path/hivequery.sh</exec>
        <file>/user/path/hivequery.sh#hivequery.sh</file>
          <capture-output/>
    </shell>
    <ok to="End"/>
    <error to="Kill"/>
</action>
<end name="End"/>

Job.properties

jobTracker=xxxx.xxx.xxx.com:port
nameNode=hdfs://xxxx.xxx.xxx.com:port

如上所述,最好通过UI进行配置