Linux运行oozie任务拒绝连接,Oozie Shell Action(Oozie 使用shell) 配置及遇到的问题总结...

问题导读

1.Shell Action 不能运行哪些shell脚本?

2.Shell Action能用来完成什么事情?

00b6bcbc02b928b436cd7bd45240dc9c.png

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里面配置。

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

输出的格式必须是合法的java属性文件。

输出的大小不能超过2KB。

语法:

...

[JOB-TRACKER]

[NAME-NODE]

...

...

[SHELL SETTINGS FILE]

[PROPERTY-NAME]

[PROPERTY-VALUE]

...

[SHELL-COMMAND]

[ARG-VALUE]

...

[ARG-VALUE]

[VAR1=VALUE1]

...

[VARN=VALUEN]

[FILE-PATH]

...

[FILE-PATH]

...

...

复制代码

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函数】来获得输出。

例子:

${jobTracker}

${nameNode}

mapred.job.queue.name

${queueName}

${EXEC}

A

B

${EXEC}#${EXEC}

Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]

复制代码

其中,job属性文件如下:

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Execute is expected to be in the Workflow directory.

#Shell Script to run

EXEC=script.sh

#CPP executable. Executable should be binary compatible to the compute node OS.

#EXEC=hello

#Perl script

#EXEC=script.pl

jobTracker=localhost:8021

nameNode=hdfs://localhost:8020

queueName=default

复制代码

运行jar里面的java程序:

${jobTracker}

${nameNode}

mapred.job.queue.name

${queueName}

java

-classpath

./${EXEC}:$CLASSPATH

Hello

${EXEC}#${EXEC}

Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]

复制代码

属性会复制指定的文件到运行该脚本的机器上。当提示找不到文件的时候,试试file

对应的属性文件是:

oozie.wf.application.path=hdfs://localhost:8020/user/kamrul/workflows/script#Hello.jar file is expected to be in the Workflow directory.

EXEC=Hello.jar

jobTracker=localhost:8021

nameNode=hdfs://localhost:8020

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属性可以自动部署该文件。

${jobTracker}

${nameNode}

for_fun.sh

for_fun.sh

复制代码

问题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。 尚未解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值