我正在尝试通过Oozie运行sh
脚本,但我遇到了一个问题:
无法运行程序“script.sh”(在目录中 “/ mapred /本地/的TaskTracker /戴尔/ jobcache / job_201312061003_0001 / attempt_201312061003_0001_m_000000_0 /工作”): java.io.IOException:error = 2,没有这样的文件或目录。
请帮我完成必要的步骤。
答案 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)
答案 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进行配置