Oozie启动作业遇到的坑

Oozie启动作业遇到的坑

  • 环境
  • Oozie启动作业的命令(启动的是Oozie的官方examples)
  • 要改变运行Job的User
  • Oozie提交Shell作业
    • Shell文件必须为Unix格式(\n为换行符,而不是\r\n)
    • 由Oozie执行的Shell文件中不要使用只有在某个节点才有的可执行环境(依赖包、参照文件等等)或者定向输出到某个主机才有的本地路径

环境

CDH-5.14.2,安全认证启用了Kerberos。

Oozie启动作业的命令(启动的是Oozie的官方examples)

在系统中找到 oozie-examples.tar.gz,加压缩后出现 examples 文件夹,将examples文件夹上传到 /user/oozie的hdfs路径上,并将/user/oozie/examples的用户chown为oozie

运行oozie命令,运行 examples中的job

oozie job -oozie http://master-67:11000/oozie/ -config ./examples/apps/map-reduce/job.properties -run

查看oozie web UI
Oozie启动作业遇到的坑_第1张图片

要改变运行Job的User

job.properties中设置的user.name属性值,在基于Kerberos的系统中是无效的。查看所运行Job的配置,user.name并不是job.properties中设置的值
Oozie启动作业遇到的坑_第2张图片
Oozie启动作业遇到的坑_第3张图片
这个User实际是kinit获取的凭据(principal)

改变User的步骤:

  1. 需要在linux系统,删除之前用kinit获取凭据时生成的 ${HOME}/.oozie-auth-token文件。$HOME是当前linux用户的用户目录(这一步有时不需要运行也可以)
  2. 用kinit获取新的凭据。通过oozie命令提交job
    如果linux系统的当前用户没有自己的用户目录,这样的步骤不一定会改变user。

Oozie提交Shell作业

Shell文件必须为Unix格式(\n为换行符,而不是\r\n)

否则在Yarn的Application的task日志中会出现如下错误

java.io.IOException: Cannot run program “catch.sh” (in directory “/home/yarn/nm/usercache/root/appcache/application_1534405855130_0022/container_1534405855130_0022_01_000002”): error=2, 没有那个文件或目录

由Oozie执行的Shell文件中不要使用只有在某个节点才有的可执行环境(依赖包、参照文件等等)或者定向输出到某个主机才有的本地路径

Oozie Shell Action的限制:

  1. 不支持交互命令。
  2. 不能通过sudo来让不同用户执行命令。
  3. 用户必须明确的上传所需要的第三方库。Oozie通过Hadoop的分布式缓冲来上传、打标签、使用。
  4. Shell命令会在任意一个hadoop 计算节点上运行,但是计算节点上默认安装的工具集可能会不一样。不过在所有的计算节点上,通常都装有大部分普通的unix工具。因此需要明确的很重要的一点是:Oozie只支持有被安装到计算节点上的命令或者通过分布式缓存上传的命令。也就是说,我们必须通过file上传我们要用到的文件。

所以,要使用Oozie提交的Job,其中的Action(包括Java、Shell等等)必须能在任意一个NodeManager所在的主机上运行,其执行环境、依赖文件(jar等等)、执行用户、用户权限、输入输出路径必须在所有NodeManager的主机上配置好。

你可能感兴趣的:(MapReduce程序开发)