无法在oozie中运行shell(错误= 2,没有这样的文件或目录)

时间:2018-07-22 08:48:41

标签: hadoop yarn hortonworks-data-platform ambari oozie-workflow

我在ambari-views ui中为工作流程中的oozie和sample.sh文件创建工作流程 运行后,我有一个错误。当我将Shell主体更改为简单命令,例如echo 1时,此错误未出现 请告诉我

2:34,752  WARN ShellActionExecutor:523 - SERVER[dlmaster02.sic] USER[root] GROUP[-] TOKEN[] APP[shell-wf] JOB[0000043-180630152627142-oozie-oozi-W] ACTION[0000043-180630152627142-oozie-oozi-W@shell-node] Launcher ERROR, reason: Main class [org.apache.oozie.action.hadoop.ShellMain], main() threw exception, Cannot run program "sample.sh" (in directory "/hadoop/yarn/local/usercache/root/appcache/application_1531029096800_0022/container_e18_1531029096800_0022_01_000002"): error=2, No such file or directory
2018-07-21 16:42:34,753  WARN ShellActionExecutor:523 - SERVER[dlmaster02.sic] USER[root] GROUP[-] TOKEN[] APP[shell-wf] JOB[0000043-180630152627142-oozie-oozi-W] ACTION[0000043-180630152627142-oozie-oozi-W@shell-node] Launcher exception: Cannot run program "sample.sh" (in directory "/hadoop/yarn/local/usercache/root/appcache/application_1531029096800_0022/container_e18_1531029096800_0022_01_000002"): error=2, No such file or directory
java.io.IOException: Cannot run program "sample.sh" (in directory "/hadoop/yarn/local/usercache/root/appcache/application_1531029096800_0022/container_e18_1531029096800_0022_01_000002"): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at org.apache.oozie.action.hadoop.ShellMain.execute(ShellMain.java:110)
    at org.apache.oozie.action.hadoop.ShellMain.run(ShellMain.java:69)
    at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:75)
    at org.apache.oozie.action.hadoop.ShellMain.main(ShellMain.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:231)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:170)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1869)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:164)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 17 more

我的工作流程的xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<workflow-app xmlns="uri:oozie:workflow:0.5" name="test">
    <start to="shell_1"/>
    <action name="shell_1">
        <shell xmlns="uri:oozie:shell-action:0.3">
            <job-tracker>${resourceManager}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>Group</name>
                    <value>hadoop</value>
                </property>
            </configuration>
            <exec>/user/ambari-qa/sample.sh</exec>
            <file>/user/ambari-qa/sample.sh</file>
        </shell>
        <ok to="end"/>
        <error to="kill"/>
    </action>
    <kill name="kill">
        <message>${wf:errorMessage(wf:lastErrorNode())}</message>
    </kill>
    <end name="end"/>
</workflow-app>

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,但就我而言,根本原因是外壳程序脚本的CRLF行分隔符(\r\n)。

当我将Shell脚本的行分隔符更改为LF(\n)时,此问题已解决。

注意:在Windows中以默认设置使用IntelliJ时,CRLF(\r\n)将成为默认的行分隔符

答案 1 :(得分:1)

在通过Ambari Workflow Management工具(即Ambari视图)执行此操作时,应编辑外壳程序动作,向下滚动到“高级属性”,然后添加要运行的“文件”,例如“ // user / admin / hello.sh”,必须是hdfs中的文件。如果不这样做,那么该文件不会被复制到纱线容器的文件缓存中,因此您将获得“找不到文件”。

如果执行此操作,然后“提交”作业,请转到仪表板,然后打开作业,然后单击“定义”选项卡,您应该看到图形工具已向工作流程中添加了<file>节点:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><workflow-app xmlns="uri:oozie:workflow:0.5" name="helloworldshell">
    <start to="shell_1"/>
    <action name="shell_1">
        <shell xmlns="uri:oozie:shell-action:0.3">
            <job-tracker>${resourceManager}</job-tracker>
            <name-node>${nameNode}</name-node>
            <exec>hello.sh</exec>
            <file>/user/admin/hello.sh</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="kill"/>
    </action>
    <kill name="kill">
        <message>${wf:errorMessage(wf:lastErrorNode())}</message>
    </kill>
    <end name="end"/>
</workflow-app>

重要的几行是:

            <exec>hello.sh</exec>
            <file>/user/admin/hello.sh</file>

<file>/x/y/z</file>这样的节点会导致将hdfs文件从hdfs上的该路径复制到远程数据节点服务器上正在运行的shell动作的当前工作目录中,该动作在纱线容器中运行。然后可以由<exec>z</exec>元素使用它,它将在最终JVM的$PWD中查找它。 $PWD设置为在运行工作的最终主机上生成的临时位置。对于工作流作业的每次运行,这可能是不同的服务器和不同的文件夹。

请注意,运行任何oozie工作流程的“纱线容器”与docker容器无关 。这是一个具有托管类路径和安全管理器的JVM,可防止您读取任意linux文件。在大型群集上,任何操作都可以在任何节点上运行,因此必须通过HDFS分发文件。有一种缓存机制可确保文件在主机上本地缓存。按yarn设置的安全管理器仅允许您访问文件缓存中正确设置的文件,该文件缓存由XML中的一个或多个<file>节点定义。

虽然如果您不了解底层技术,那么Workflow GUI似乎非常有用,那么在调试时该手册就不是很有用。最好在边缘节点的命令行上执行一些“ hello world”作业,首先将示例xml放入hdfs文件夹中,然后使用命令行工具启动作业。工作流Web UI只是在顶部添加图形使用界面。

通常,您要做的是将文件放入保存的工作流下方的子文件夹中:

$ tree shdemo
shdemo
├── bin
│   ├── hello.sh
└── workflow.xml

在工作流程中,使用文件的相对路径而不是绝对路径:

<file>bin/hello.sh#hello.sh</file>

#表示将文件符号链接到$ PWD,这是可选的,但可能会有所帮助。使用复杂的工作流程,您可以为不同的文件类型(例如“ bin”,“ config”,“ data”)使用不同的子文件夹。然后,您可以将许多<file?条目添加到工作流XML中。最后,将所有这些文件夹从运行它的位置复制到hdfs中:

 # copy up the workflow files and subfolders into hdfs
 hdfs dfs -copyFromLocal -f shdemo /user/$(whoami)/my_workflows

 # launch it from that location within hdfs
 oozie job -oozie $OOZIE_URL -config shdemo-job.properties -run

您会注意到,当您使用工作流程GUI来提交作业时,必须将工作流程“保存”到HDFS文件夹。在该hdfs文件夹中,您将添加上面引用的bin/hello.sh。再次,Web UI只是命令行技术的外观。在命令行上使用一个简单的文件后,您可以将其导入工作流程GUI中,对其进行编辑,然后将其保存回相同的hdfs位置。

答案 2 :(得分:0)

请尝试以下操作,并让我知道您的结果。

<exec>sample.sh</exec>
<file>${nameNode}/user/ambari-qa/sample.sh</file>

它需要具有Namenode的完整路径才能访问,否则它将寻找默认路径,并且在此错误表明脚本在默认路径中不可用。