分享

oozie 调用shell action 引用不到环境变量

zayliu1 发表于 2014-5-19 15:30:22 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 41649
oozie 调用shell action 引用不到环境变量
执行sh 脚本时报错:

无语的 错误信息:
  MapReduce workflow failed, error message[Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]]

  可能是环境变量没配置,比如我这边调用的,test1.sh脚步就会出现
  test1.sh
  #/bin/bash
  hadoop fs -mkdir /user/hddtmn/examples/test111111
  sh文件内容如上图,在hdfs上面创建一个文件,就报错了。这错误信息太无语了
  
1. 原因感觉hadoop 命令不能被识别,需要自己workflow.xml设定,或者使用绝对路径如:
   将hadoop命令,修改成绝对路径
   test1.sh
   #/bin/bash
   /usr/local/hadoop/bin/hadoop fs -mkdir /user/hddtmn/examples/test111111
   修改后再重新执行job,成功了,-_-

2.这样写绝对路径很麻烦呀,然后查看官方文档,通过workflow.xml来配置环境变量
增加一行代码
<env-var>PATH=$PATH:/usr/local/hadoop/bin</env-var>
加了这行还报错啊,没效果...oozie 日志信息太无语了,啥都没报出来,配置写错了?

有大神清楚oozie 调用shell action 环境变量怎么配置不?


已有(3)人评论

跳转到指定楼层
sstutu 发表于 2014-5-19 17:41:22
小伙,没有看到你的图。不过下面资料你可以参考一下:Oozie Shell Action 配置
1. Shell Action

Shell action运行一个shell命令,需要配置的有job-tracker,name-node和一些必要的参数。

经过配置,在启动Shell Action之前可以创建或删除HDFS文件夹。

可以通过配置文件(通过job-xml元素)给定配置信息,或者是用内嵌的configuration元素进行配置。

可以在内嵌的configuration里面使用EL表达式,在configuration里面配置的信息会覆盖job-xml里面相同的值。

需要注意的是,Hadoop的mapred.job.tracker和fs.default.name属性不可以在内嵌的configuration里面配置。

跟hadoop的map-reduce jobs一样,可以添加附件到sqoop job里面。具体参见【http://archive.cloudera.com/cdh/ ... rchives_for_the_Job

shell任务的标准输出(STDOUT)在shell运行结束之后是可用的。这些信息可以被决策结点使用。如果shell job的输出被配置成可用的,那shell命令必须包含以下两个参数:

输出的格式必须是合法的java属性文件。
输出的大小不能超过2KB。
语法:

  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.2">
  2.     ...
  3.     <action name="[NODE-NAME]">
  4.         <shell xmlns="uri:oozie:shell-action:0.1">
  5.             <job-tracker>[JOB-TRACKER]</job-tracker>
  6.             <name-node>[NAME-NODE]</name-node>
  7.             <prepare>
  8.                <delete path="[PATH]"/>
  9.                ...
  10.                <mkdir path="[PATH]"/>
  11.                ...
  12.             </prepare>
  13.             <job-xml>[SHELL SETTINGS FILE]</job-xml>
  14.             <configuration>
  15.                 <property>
  16.                     <name>[PROPERTY-NAME]</name>
  17.                     <value>[PROPERTY-VALUE]</value>
  18.                 </property>
  19.                 ...
  20.             </configuration>
  21.             <exec>[SHELL-COMMAND]</exec>
  22.             <argument>[ARG-VALUE]</argument>
  23.                 ...
  24.             <argument>[ARG-VALUE]</argument>
  25.             <env-var>[VAR1=VALUE1]</env-var>
  26.                ...
  27.             <env-var>[VARN=VALUEN]</env-var>
  28.             <file>[FILE-PATH]</file>
  29.             ...
  30.             <archive>[FILE-PATH]</archive>
  31.             ...
  32.             <capture-output/>
  33.         </shell>
  34.         <ok to="[NODE-NAME]"/>
  35.         <error to="[NODE-NAME]"/>
  36.     </action>
  37.     ...
  38. </workflow-app>
复制代码

prepare元素里面配置启动job前要删除或者创建的文件夹,文件夹路径必须是以hdfs://HOST:PORT开头。

job-xml指定一个存在的配置文件。

configuration里面配置传递给sqoop job的参数。

exec元素包含要执行的shell命令的路径。可以给shell命令添加参数。

argument元素指定要传递给shell脚本的参数。

env-var包含传递给shell命令的环境变量。env-var只能包含一个环境变量和值。如果这个环境变量包含像$PATH一样的,那它必须写成PATH=$PATH:mypath。不能用${PATH},因为它将会被EL解析。

capture-output元素指定用来捕获shell脚本的标准输出。可以通过String action:output(String node, String key)函数【EL函数】来获得输出。

例子:

  1. <workflow-app xmlns='uri:oozie:workflow:0.2' name='shell-wf'>
  2.     <start to='shell1' />
  3.     <action name='shell1'>
  4.         <shell xmlns="uri:oozie:shell-action:0.1">
  5.             <job-tracker>${jobTracker}</job-tracker>
  6.             <name-node>${nameNode}</name-node>
  7.             <configuration>
  8.                 <property>
  9.                   <name>mapred.job.queue.name</name>
  10.                   <value>${queueName}</value>
  11.                 </property>
  12.             </configuration>
  13.             <exec>${EXEC}</exec>
  14.             <argument>A</argument>
  15.             <argument>B</argument>
  16.             <file>${EXEC}#${EXEC}</file> <!--Copy the executable to compute node's current working directory -->
  17.         </shell>
  18.         <ok to="end" />
  19.         <error to="fail" />
  20.     </action>
  21.     <kill name="fail">
  22.         <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
  23.     </kill>
  24.     <end name='end' />
  25. </workflow-app>
复制代码

其中,job属性文件如下:
  1. oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Execute is expected to be in the Workflow directory.
  2. #Shell Script to run
  3. EXEC=script.sh
  4. #CPP executable. Executable should be binary compatible to the compute node OS.
  5. #EXEC=hello
  6. #Perl script
  7. #EXEC=script.pl
  8. jobTracker=localhost:8021
  9. nameNode=hdfs://localhost:8020
  10. queueName=default
复制代码
运行jar里面的java程序:
  1. <workflow-app xmlns='uri:oozie:workflow:0.2' name='shell-wf'>
  2.     <start to='shell1' />
  3.     <action name='shell1'>
  4.         <shell xmlns="uri:oozie:shell-action:0.1">
  5.             <job-tracker>${jobTracker}</job-tracker>
  6.             <name-node>${nameNode}</name-node>
  7.             <configuration>
  8.                 <property>
  9.                   <name>mapred.job.queue.name</name>
  10.                   <value>${queueName}</value>
  11.                 </property>
  12.             </configuration>
  13.             <exec>java</exec>
  14.             <argument>-classpath</argument>
  15.             <argument>./${EXEC}:$CLASSPATH</argument>
  16.             <argument>Hello</argument>
  17.             <file>${EXEC}#${EXEC}</file> <!--Copy the jar to compute node current working directory -->
  18.         </shell>
  19.         <ok to="end" />
  20.         <error to="fail" />
  21.     </action>
  22.     <kill name="fail">
  23.         <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
  24.     </kill>
  25.     <end name='end' />
  26. </workflow-app>
复制代码
<file>属性会复制指定的文件到运行该脚本的机器上。当提示找不到文件的时候,试试file

对应的属性文件是:


  1. oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Hello.jar file is expected to be in the Workflow directory.
  2. EXEC=Hello.jar
  3. jobTracker=localhost:8021
  4. nameNode=hdfs://localhost:8020
  5. queueName=default
复制代码
2. Shell Action 日志

shell action的stdout和stderr输出被重定向到运行该脚本的oozie执行器上的map-reduce任务的stdout。

除了在Oozie的web网页上可以看到少部分日志,还可以在hadoop的job-tracker的网页上看到详细的日志信息。

3. Shell Action 限制

虽然Shell Action可以执行任意的shell命令,但是有以下几个限制:

不支持交互命令。

不能通过sudo来让不同用户执行命令。

用户必须明确的上传所需要的第三方库。Oozie通过Hadoop的分布式缓冲来上传、打标签、使用。

Shell命令会在任意一个hadoop 计算节点上运行,但是计算节点上默认安装的工具集可能会不一样。不过在所有的计算节点上,通常都装有大部分普通的unix工具。因此需要明确的很重要的一点是:Oozie只支持有被安装到计算节点上的命令或者通过分布式缓存上传的命令。也就是说,我们必须通过file上传我们要用到的文件。








回复

使用道具 举报

zayliu1 发表于 2014-5-20 10:03:09
sstutu 发表于 2014-5-19 17:41
小伙,没有看到你的图。不过下面资料你可以参考一下:Oozie Shell Action 配置
1. Shell Action

谢谢,这篇文章看了

就是上面的这个属性
<env-var>[VAR1=VALUE1]</env-var>

我配置了却没有作用,不知道是哪里出了问题
<env-var>PATH=$PATH:/usr/local/hadoop/bin</env-var>
回复

使用道具 举报

Sempre 发表于 2015-11-11 17:59:31
我也遇到了类似的问题,请问楼主后来解决了吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条