分享

Oozie Shell Action(Oozie 使用shell) 配置及遇到的问题总结

desehawk 2014-12-22 12:57:25 发表于 实操演练 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 131491
问题导读
1.Shell Action 不能运行哪些shell脚本?
2.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/3/oozie/WorkflowFunctionalSpec.html#a3.2.2.1_Adding_Files_and_Archives_for_the_Job
shell任务的标准输出(STDOUT)在shell运行结束之后是可用的。这些信息可以被决策结点使用。如果shell job的输出被配置成可用的,那shell命令必须包含以下两个参数:
  • 输出的格式必须是合法的java属性文件。
  • 输出的大小不能超过2KB。
语法:
  1.     ...
  2.             [JOB-TRACKER]
  3.             [NAME-NODE]
  4.                ...
  5.                ...
  6.             [SHELL SETTINGS FILE]
  7.                     [PROPERTY-NAME]
  8.                     [PROPERTY-VALUE]
  9.                 ...
  10.             [SHELL-COMMAND]
  11.             [ARG-VALUE]
  12.                 ...
  13.             [ARG-VALUE]
  14.             [VAR1=VALUE1]
  15.                ...
  16.             [VARN=VALUEN]
  17.             [FILE-PATH]
  18.             ...
  19.             [FILE-PATH]
  20.             ...
  21.     ...
复制代码


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.             ${jobTracker}
  2.             ${nameNode}
  3.                   mapred.job.queue.name
  4.                   ${queueName}
  5.             ${EXEC}
  6.             A
  7.             B
  8.             ${EXEC}#${EXEC}
  9.         Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
复制代码

其中,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.             ${jobTracker}
  2.             ${nameNode}
  3.                   mapred.job.queue.name
  4.                   ${queueName}
  5.             java
  6.             -classpath
  7.             ./${EXEC}:$CLASSPATH
  8.             Hello
  9.             ${EXEC}#${EXEC}
  10.         Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
复制代码

<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上传我们要用到的文件。
http://archive.cloudera.com/cdh/3/oozie/DG_ShellActionExtension.html


Oozie运行Shell的一些问题:


Oozie会随机选择一台机器运行shell脚本。 因此必须保证每台机器都有能正常运行该脚本,其中包括:必要的文件,环境变量,包等。 要查看shell运行的错误信息,可以到hadoop的jobtracker网页查看。 问题1:No such file or directory 如果是提示找不到shell脚本,那就说明脚本没有被复制到对应的电脑上。在workflow.xml里面,通过file属性可以自动部署该文件。

  1. <shell xmlns="uri:oozie:shell-action:0.1">
  2.     <job-tracker>${jobTracker}</job-tracker>
  3.     <name-node>${nameNode}</name-node>
  4.     <exec>for_fun.sh</exec>
  5.     <file>for_fun.sh</file><!--添加这行-->
  6.     <capture-output/>
  7. </shell>
复制代码

问题2:在shell脚本里面运行sqoop命令,却出错: com.cloudera.sqoop.tool.ImportTool: Encountered IOException running import job: java.io.IOException: The ownership on the staging directory hdfs://pangu-hdpnn.dscc:11000/mapred/staging/jiyaodian/.staging is not as expected. It is owned by jiyaodian. The directory must be owned by the submitter work or by work。 尚未解决


转载请注明: 转载自http://jyd.me/



已有(2)人评论

跳转到指定楼层
liuzhixin137 发表于 2016-7-22 11:35:02
oozie 调用的shell

能在shell中去操作本地文件吗?
比如 mkdir /opt/test/
比如 echo "12" >> /opt/123.txt
这样的 我测试了好几次,都不行,是否可行呢,还是说有什么配置
回复

使用道具 举报

tsubasawzj 发表于 2017-7-19 15:54:27
本帖最后由 tsubasawzj 于 2017-7-19 15:56 编辑

请问
问题2:在shell脚本里面运行sqoop命令,却出错: com.cloudera.sqoop.tool.ImportTool: Encountered IOException running import job: java.io.IOException: The ownership on the staging directory hdfs://pangu-hdpnn.dscc:11000/mapred/staging/jiyaodian/.staging is not as expected. It is owned by jiyaodian. The directory must be owned by the submitter work or by work。 尚未解决

这个问题解决了吗?

我执行workflow的用户是hue
我在shell action中whoami 得到的是yarn
但是因为
[backcolor=rgba(0, 0, 255, 0.0470588)][size=14.399999618530273px]Permission denied: user=hue, access=EXECUTE, inode="/user/yarn/.staging":yarn:supergroup:drwx------
导致无法再shell脚本中执行sqoop,请问应该怎样能不使用/user/yarn/.staging而使用/user/hue/.staging啊?

我尝试在shell脚本中,执行sqoop前添加 hadoop fs -chmod 777 /user/yarn/.staging
hadoop fs -ls /user/yarn/ 能看到 属性已经变成了drwxrwxrwx
但是继续执行sqoop,还是因为[size=14.399999618530273px]yarn:supergroup:drwx------ 报错
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条