humidy
作者humidy2015-07-22 16:11
信息分析/架构师, 某公司

OOZIE调用shell脚本做mr计算挂死问题分析和解决

字数 5886阅读 9439评论 2赞 1

胡旻整理              转载请注明

今天在看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.

111.png

其实要解决这个问题,就需要明确要调用的shell使用的是本地的shell,在一本书上找到了对Action的解释

112.png

明确阐述可以通过SSH来特别指定本地文件。

如我们定义了一个Workflow,文件如下

113.png

其中我们把TB数据排序的程序,产生数据模块、排序数据模块和验证数据模块三部分连接起来。每个sh中使用hadoop jar命令来调用

114.png

 

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

115.png

可以看到运行Oozie Server的用户是Oozie。在/etc/passwd中更改Oozie用户,使得其可登入。

116.png

 

我提交Oozie的任务时root。所以这里要对从Oozie用户到root用户做免秘钥登入。

即在Oozie用户下可以ssh root@hchope3

运行结果如下:

117.png

118.png

可见已经可以顺利的跑通了。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论2 条评论

Spring GingerSpring Ginger软件开发工程师, nothing
2016-09-26 13:00
CDH集群如何做到从Oozie用户到root用户做免秘钥登入,谢谢!
yshysh软件开发工程师, 浪潮集团
2016-05-13 16:31
你好,在使用的时候遇到   java.io.IOException: Not able to perform operation的问题,想咨询一下从Oozie用户到root用户做免秘钥登入是怎么实现的,谢谢。
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广