胡旻整理 转载请注明
今天在看Oozie方面的文章时候,机缘巧合,看到一个问题
OOZIE调用shell脚本,在.sh脚本里我又调用hadoop jar。。。执行mr计算,,开始提示内存不够,我把内存开大后通过oozie分配运行这个sh文件的节点直接挂死了,我在任意节点上执行这个sh只需要10分钟。是不是oozie不支持这种shell脚本内部调用mr啊,各位有没有经验。 ----来自CSDN |
回想自己刚用Oozie的时候也遇到过相同的坑。看论坛大家的分析思路,比较有意思。
看yarn里oozie的map进度已经100%,总体进度95%。没看到shell里面调用的那个mr运行的job,这其实是在map中调用另一个mr过程,估计是不能这么玩。 |
其实这和Oozie对Shell这个Action处理的方式上有直接关系。我们实际上本来是想运行本地的相应shell脚本,然而在用Shell这个Action时候,Oozie会运行在HDFS上的shell。这个时候会先生成一个Application Master去为将要运行的hadoop jar分配对应的容器,但运行Application Master的用户,和运行在HDFS上的shell的用户往往会不同,这是因为Oozie会使用到Hadoop的用户伪装机制。如我用root去启动oozie的Shell Action。调用Shell Action的用户可能是yarn.
其实要解决这个问题,就需要明确要调用的shell使用的是本地的shell,在一本书上找到了对Action的解释
明确阐述可以通过SSH来特别指定本地文件。
如我们定义了一个Workflow,文件如下
其中我们把TB数据排序的程序,产生数据模块、排序数据模块和验证数据模块三部分连接起来。每个sh中使用hadoop jar命令来调用
Workflow文件内容定义如下:
<!--******************************************--> <!--workflow.xml --> <!--******************************************--> <workflow-app name="humidySshTest" xmlns="uri:oozie:workflow:0.1"> <start to="cleanJob"/> <action name="cleanJob"> <fs> <delete path="hdfs://hc-dream/tera_in"/> <delete path="hdfs://hc-dream/tera_out"/> <delete path="hdfs://hc-dream/tera_validate"/> </fs> <ok to="Teragen"/> <error to="killAction"/> </action> <action name="Teragen"> <ssh xmlns="uri:oozie:ssh-action:0.1"> <host>${focusNodeLogin}</host> <command>${shellScriptTeragen}</command> <capture-output/> </ssh> <ok to="Terasort"/> <error to="killAction"/> </action> <action name="Terasort"> <ssh xmlns="uri:oozie:ssh-action:0.1"> <host>${focusNodeLogin}</host> <command>${shellScriptTerasort}</command> <capture-output/> </ssh> <ok to="Teravalidate"/> <error to="killAction"/> </action> <action name="Teravalidate"> <ssh xmlns="uri:oozie:ssh-action:0.1"> <host>${focusNodeLogin}</host> <command>${shellScriptTeravalidate}</command> <capture-output/> </ssh> <ok to="end"/> <error to="killAction"/> </action> <kill name="killAction"> <message>"Killed job due to error"</message> </kill> <end name="end"/> </workflow-app> |
job.properties文件内容定义如下:
#************************************************* # job.properties #************************************************* nameNode=hdfs://hc-dream jobTracker=hcdream3:8032 queueName=operations oozie.libpath=${nameNode}/user/oozie/share/lib oozie.use.system.libpath=true oozie.wf.rerun.failnodes=true oozieProjectRoot=${nameNode}/user/${user.name}/examples/apps appPath=${oozieProjectRoot}/humidySsh oozie.wf.application.path=${appPath} #inputDir=${oozieProjectRoot}/data focusNodeLogin=root@hchope3 #sourceDataPath=~/data #destinationPath=${oozieProjectRoot/results-sshAction} shellScriptTeragen=/usr/share/doc/oozie-4.0.0+cdh5.3.3+340/examples/apps/humidySsh/teragen.sh shellScriptTerasort=/usr/share/doc/oozie-4.0.0+cdh5.3.3+340/examples/apps/humidySsh/terasort.sh shellScriptTeravalidate=/usr/share/doc/oozie-4.0.0+cdh5.3.3+340/examples/apps/humidySsh/teravalidate.sh |
注:在使用Ssh这个Action的时候,可能会遇到AUTH_FAILED:Not able to perform operation的问题,这是因为在使用ssh这个Action的时候我们要对Oozie的服务器做些免秘钥登入,例如我这里
ps -ef | grep oozie |
可以看到运行Oozie Server的用户是Oozie。在/etc/passwd中更改Oozie用户,使得其可登入。
我提交Oozie的任务时root。所以这里要对从Oozie用户到root用户做免秘钥登入。
即在Oozie用户下可以ssh root@hchope3 |
运行结果如下:
可见已经可以顺利的跑通了。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论2 条评论
2016-09-26 13:00
2016-05-13 16:31