Hadoop 中 uber 模式的目的是什么?

What is the purpose of uber mode in Hadoop?

这里是 Hadoop 的新手。当作业 运行ning 处于超级模式时,ApplicationMaster 不会从 ResourceManager 请求容器。相反,在单个节点上 运行ning 的 AM 仅在其自己的进程中执行整个作业。这是有利的,因为它减少了必须处理 RM 的开销。

我不明白的是:如果作业足够小,可以在单个节点上在合理的时间内完成,那么首先提交 MapReduce 作业的意义何在? MapReduce 通过允许跨多台机器并行执行计算来加速计算。如果我们只打算使用一个节点,为什么不写一个常规程序然后 运行 在我们的本地机器上呢?

可能有以下原因:

  1. 您有一个可重复使用的流程,可以根据需要进行扩展,在这种情况下,它可能会开始使用更多的插槽,而不是 运行 在超级模式下。
  2. 保持简单。你不太可能写一份工作,通常你会有很多处理不同数量的数据。为什么要改变事物并选择特定的工作来使用不同的方法处理数据。
  3. 运行在 MapReduce 之外运行的程​​序可能会失去框架提供的许多额外好处,例如故障恢复。

我在使用 Apache C运行ch 时遇到的一个特定场景是,一个管道由多个 MapReduce (MR) 作业组成,这些作业由各种 DoFn(核心逻辑写入的地方)旋转,每个 DoFn 结果都变成一个 Map and/or reduce 作业,其输出通常存储在不可变的分布式对象 (PTable/PCollection) 中,在这种情况下,基于这些 DoFn 运行ning 在 [=15] 上处理的数据量=],框架决定是否 运行 管道中的每个 MR 作业以 uber 或普通模式。因此,当我们查看此管道的最终作业计数器时,它可能是超级 and/or 普通 MR 作业的混合。

考虑另一种情况,其中 M/R 作业 运行 处于增量和完全加载模式,其中相同的逻辑可能会提供较少的数据,这些数据可以由最少数量的 Mappers 和 Reducer 处理或者,它可能会充满历史数据,需要更多的 Mappers 和 Reducers 来处理,所以本质上逻辑保持不变,但数据和输入拆分的数量发生变化,在这些情况下你不想进出Hadoop 集群根据大小处理数据并让框架决定模式(超级或普通)。