Oozie - 有没有办法让 java 操作的单个实例在整个集群上执行?

Oozie - Is there a way to have only a single instance of the java action executing on the entire cluster?

当我查看我的日志时,我发现我的 oozie java 操作实际上是 运行 在多台机器上。

我想那是因为它们被包裹在 m/r 工作中? (正确吗)

有没有办法让 java 操作的单个实例在整个集群上执行?

Java 操作在 Oozie "launcher" 作业中运行,只有 一个 YARN "map" 容器.

诀窍在于每个 YARN 作业都需要一个 应用程序主 (AM) 容器 进行协调。
所以你最终有 2 个容器,_0001 用于 AM,_0002 用于 Oozie 操作,可能在不同的机器上。

要控制每个资源的分配,您可以设置以下操作属性来覆盖您的 /etc/hadoop/conf/*-site.xml 配置 and/or 硬编码默认值(特定于每个版本和每个发行版,顺便说一下):

  • oozie.launcher.yarn.app.mapreduce.am.resource.mb
  • oozie.launcher.yarn.app.mapreduce.am.command-opts (将最大堆大小与全局内存最大值对齐)
  • oozie.launcher.mapreduce.map.memory.mb
  • oozie.launcher.mapreduce.map.java.opts (...)
  • oozie.launcher.mapreduce.job.queuename (如果你有多个不同优先级的队列)


好吧,实际上,上面的解释并不完全正确......在 HortonWorks 发行版上,你最终会得到 2 个容器,正如预期的那样。
但是对于 Cloudera 发行版,您通常最终只会得到 一个 容器,运行 AM 和动作都在同一个 Linux进程。

我不知道他们是怎么做到的。也许某处有通用的 YARN 配置,也许它是 Cloudera 特定的功能。