分享

oozie 调用 shell 中的疑惑

大家好,先说说我的需求。

要使用oozie调用shell,当然我已经实现了调用普通的shell,类似 ping,ssh 那一类。

我这个shell要调用的 productlog-new.sh 中,使用命令调用一个可执行的scala写的程序,jar包形式,

nohup scala   /user/root/mytest/STBLogProduct7.jar     hdfs://nameservice1 /user/root/mytest/stblog/ 2>&1 &

是用来产生模拟日志用,/user/root/mytest/STBLogProduct7.jar  这是一个 hdfs 路径。jar包放在hdfs上。

我的oozie任务已经成功跑完,shell 的node状态也是成功,但是hdfs上并没有相应产生日志。意思即 shell调用了,但是调用结果未知。

看看大家有没有什么建议,多谢!
workflow.xml 调用shell的节点配置
<action name="shell-node">
        <shell xmlns="uri:oozie:shell-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>                       
            <name-node>${nameNode}</name-node>            
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>                               
            </configuration>
            <exec>productlog-new.sh</exec>
                        <file>productlog-new.sh</file>
        </shell>
        <ok to="email-ok"/>
        <error to="email-fail"/>
    </action>

已有(6)人评论

跳转到指定楼层
liuzhixin137 发表于 2016-7-19 11:22:51
那么我的问题   就变成了

在hdfs 上 用shell命令执行一个 可执行jar文件 ,该jar文件操作的也都是hdfs目录,这样到底能不能成功。

意即hdfs文件系统是否 在这里能当成 本地文件系统一样来用。

如果不行,我的可执行jar文件放到本地上,在hdfs上如何能够调用到呢
回复

使用道具 举报

liuzhixin137 发表于 2016-7-19 11:27:52
是否还有别的可行的解决方法呢
回复

使用道具 举报

liuzhixin137 发表于 2016-7-19 11:45:30
3. Shell Action 限制

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

不支持交互命令。

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

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

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

看到这一段,我的shell 命令调用了 scala  ,然后我的每个hadoop节点都支持scala 。但是那个Jar包文件确实没有执行。
回复

使用道具 举报

qcbb001 发表于 2016-7-19 17:07:35
如果楼主自己定义的,日志需要自己写。比如你成功了,就打印日志,失败了,同样也需要写到日志里。
日志不是凭空产生的,都是需要我们自己去写的。
同样另外一种办法,就是你想要什么,得到了什么。如果一致说明你成功了。
至于日志,则需要自己定义的程序加上即可
回复

使用道具 举报

liuzhixin137 发表于 2016-7-19 17:19:38
qcbb001 发表于 2016-7-19 17:07
如果楼主自己定义的,日志需要自己写。比如你成功了,就打印日志,失败了,同样也需要写到日志里。
日志不 ...

我的Jar包 就是用来产生测试日志的,然后使用oozie调度定时生成。

我现在的做法就是,使用oozie 循环调度shell。
我现在的理解就是,集群会选择在一个节点上运行 .sh 文件,该.sh 文件的内容是
#!/bin/bash
source ~/.bashrc
source /etc/profile
nohup scala /home/cdh/cloudera/jars/STBLogProduct7.jar hdfs://bigdata1:8020 /user/root/mytest/stblog/ >> /home/cdh/cloudera/logs/producelog.log 2>&1 &


STBLogProduct7.jar这个包是产生日志的, /home/cdh/cloudera/jars/STBLogProduct7.jar这个路径是本地路径,我在每个节点上都有这个路径,且有这个文件。


oozie 定时调度成功,没有报错,但是这个 STBLogProduct7.jar 包并没有成功执行,我应该如何去做配置,还有 这个shell脚本 是否是在本地运行的?


多谢!
回复

使用道具 举报

langke93 发表于 2016-7-19 20:04:53
liuzhixin137 发表于 2016-7-19 17:19
我的Jar包 就是用来产生测试日志的,然后使用oozie调度定时生成。

我现在的做法就是,使用oozie 循环 ...

楼主可以尝试其他方法,这里有关于
scala支持源文件解释执行,jar执行,各有利弊,做个脚本判断如果jar存在则执行jar,如果jar不存在或scala文件已更新则解释执行并生成jar文件。


[mw_shl_code=bash,true]#!/bin/bash


srcfile="$1"

if [ $# -lt 1 ] || [ "${srcfile}" == "" ]; then
  echo need at least one parameter for the scala source file to run >&2
  exit 1
fi

shift

name=${srcfile%.*}
ext=${srcfile##*.}

if [ "${ext}" == "scala" ] && [ -f "${srcfile}" ]; then
  needcompile=1
  scalatime=`stat -c %Y "${srcfile}"`
  if [ -f "${name}.jar" ]; then
    jartime=`stat -c %Y "${name}.jar"`
    if [ ${scalatime} -lt ${jartime} ]; then
      needcompile=0
    else
      rm "${name}.jar"
      echo rm "${name}.jar" >&2
    fi
  fi
  if [ ${needcompile} -eq 1 ]; then
    echo run scala -save -d "${name}.jar" "${srcfile}" "$@" >&2
    run scala -save -d "${name}.jar" "${srcfile}" "$@"
  else
    echo run scala "${name}.jar" "$@" >&2
    run scala "${name}.jar" "$@"
  fi
elif [ "${ext}" == "jar" ] && [ -f "${srcfile}" ]; then
  echo run scala "${name}.jar" "$@" >&2
  run scala "${name}.jar" "$@"
else
  echo nothing to do >&2
fi
[/mw_shl_code]

从上面,应该看出是run scala "${name}.jar" "$@"的方式。、
楼主可以尝试这种方式试试


回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条