0

我正在使用 oozie 的 REST API 来调用 shell 脚本操作。任何包含访问或使用 HDFS 的脚本都会失败。

我用这个简单的脚本测试

#!/bin/bash -e
hadoop fs -touchz aaa

当我运行从命令行调用此脚本的 Oozie 工作流时——作为“root”——它工作正常。当我从 REST API 调用它时,它失败并显示错误代码 JA018 和错误消息:

Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]

我确信我的 oozie 资产设置正确(即 job.properties 和 workflow.xml),因为如果我换出“touch /tmp/aaa”(即 linux touch 命令),工作流就会成功完成。

首先,我找不到 JA018 实际上是什么的明确文档。

其次(主要是),我认为我的错误的原因可能是权限。当脚本工作时(即,使用 linux touch 命令——而不是 HDFS touchz),我将作业属性user.name作为“root”传递给 Oozie REST 服务器。Oozie REST 服务器(根据 Cloudera 配置作为“oozie”运行)不会在“user.name”传递给它时运行作业(否则它可能会以“root”身份运行工作流并且它会工作)。有什么方法我需要配置 oozie ID 才能以我传递给它的 user.name 身份运行?我应该使用 root 以外的 ID 吗?(我使用 root 正是因为它拥有所有权限。)

似乎这是其他人会遇到的问题,但我在网上几乎没有发现任何问题。可能有一些我只是想念的标准方法。

我正在使用 Cloudera 4.1.3。

感谢您的任何想法/建议。

4

1 回答 1

0

我的方法和假设是错误的——这就是问题所在。事实证明,Oozie 不支持这种事情,因为 shell 脚本作为 Oozie 在 HDFS 内部执行的用户不同的用户运行。换句话说,运行 shell 脚本会丢失 Oozie 在 HDFS 中执行操作的上下文。因此,让 Oozie 调用 shell 脚本并期望它能够在 HDFS 中执行操作是错误的方法。

Oozie 在 HDFS 中可以显式执行的操作有点受限,但似乎这是在 Oozie 中调用 HDFS 操作的方式。

于 2014-01-31T17:55:05.937 回答