java - Oozie:从 Oozie <java> 操作启动 Map-Reduce?

标签 java hadoop mapreduce oozie avro

我正在尝试使用 <java> 在 Oozie 工作流中执行 Map-Reduce 任务行动。

O'Reilley 的 Apache Oozie(Islam and Srinivasan 2015)指出:

While it’s not recommended, Java action can be used to run Hadoop MapReduce jobs because MapReduce jobs are nothing but Java programs after all. The main class invoked can be a Hadoop MapReduce driver and can call Hadoop APIs to run a MapReduce job. In that mode, Hadoop spawns more mappers and reducers as required and runs them on the cluster.

但是,我使用这种方法没有成功。

工作流中的 Action 定义如下所示:

<java>
    <!-- Namenode etc. in global configuration -->
    <prepare>
      <delete path="${transformOut}" />
    </prepare>
    <configuration>
        <property>
            <name>mapreduce.job.queuename</name>
            <value>default</value>
        </property>
    </configuration>
    <main-class>package.containing.TransformTool</main-class>
    <arg>${transformIn}</arg>
    <arg>${transformOut}</arg>
    <file>${avroJar}</file>
    <file>${avroMapReduceJar}</file>
</java>

工具实现的 main()实现看起来像这样:

public static void main(String[] args) throws Exception {
    int res = ToolRunner.run(new TransformTool(), args);
    if (res != 0) {
        throw new Exception("Error running MapReduce.");
    }
}

工作流每次都会崩溃并出现上面的“Error running MapReduce”异常; 如何获取 MapReduce 的输出来诊断问题?使用这个有问题吗Tool运行 MapReduce 应用程序? 我是否使用了错误的 API 调用?

我非常不愿意使用 Oozie <map-reduce> Action ,因为工作流中的每个 Action 都依赖于几个单独版本化的 AVRO 模式。

这里有什么问题?我正在使用"new"mapreduce任务的 API。

感谢您的帮助。

最佳答案

> 我如何获得 MapReduce 的输出...

回到基础。

由于您不想提及您使用的是哪个版本的 Hadoop 和哪个版本的 Oozie,因此我假设是“最新”设置(例如 Hadoop 2.7 w/TimelineServer 和 Oozie 4.2)。由于您没有提到您使用的是哪种界面(命令行?原生 Oozie/Yarn UI?Hue?),我将举几个使用“旧”CLI 的示例。

> oozie jobs -localtime -len 10 -filter name=CrazyExperiment

显示“CrazyExperiment”工作流程的最后 10 次执行,以便您可以在接下来的命令中注入(inject)适当的“作业 ID”。

> oozie job -info 0000005-151217173344062-oozie-oozi-W

从 Oozie 的角度显示该执行的状态。如果您的 Java 操作卡在 PREP 模式,那么 Oozie 无法将其提交到 YARN;否则你会在“外部 ID”下找到类似 job_1449681681381_5858 的内容。但要小心! job 前缀是一个遗留的东西;实际的 YARN ID 是 application_1449681681381_5858

> oozie job -log 0000005-151217173344062-oozie-oozi-W

如预期的那样显示 Oozie 日志。

> yarn logs -applicationId application_1449681681381_5858

显示 AppMaster(容器 #1)和 Java 操作启动器(容器 #2)的综合日志——执行结束后。 Launcher 的stdout 日志包含一大堆 Oozie 调试内容,真正的 stdout 在最底部。

如果您的 Java 操作成功生成了另一个 YARN 作业,并且您小心地显示了子“应用程序 ID”,您应该能够在那里检索它并针对它运行另一个 yarn logs 命令.

享受接下来 5 天的调试 ;-)

关于java - Oozie:从 Oozie <java> 操作启动 Map-Reduce?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34344114/

相关文章:

java - (1)转换ECDSA私钥和公钥,(2)ECDSA验证

hadoop - 启动hadoop守护程序问题

performance - 如何调出内存异常 Spark

python - 在带有 PySpark 的单个多核机器中使用大型查找表

javascript - 在 MapReduce MongoDB 中按键对数据进行分组

java - hadoop: sqoop- 为什么 jdbc 代码是用 reducer 写的?

Java 字符串扫描器下一行输入字符串不符合预期

java - 数组问题中的最小最大

java - 编写自定义 Flume 装饰器,但出现错误。我错过了什么?

hadoop - 修改hadoop conf目录下的xml配置文件后需要重启hadoop吗?