为啥即使使用单个 reducer 也会调用 Partitioner

Posted

技术标签:

【中文标题】为啥即使使用单个 reducer 也会调用 Partitioner【英文标题】:Why is the Partitioner invoked even with a single reducer为什么即使使用单个 reducer 也会调用 Partitioner 【发布时间】:2014-04-15 11:56:43 【问题描述】:

如果我们将 MR 作业配置为仅使用单个 reducer 运行,则不需要调用 Partitioner 似乎是合乎逻辑的。

但是我只是试了一下,看起来分区器被调用了,即使作业配置了单个减速器。

任何想法为什么需要这样做?

【问题讨论】:

【参考方案1】:

这是因为将键/值对分配给特定的减速器是扮演分区器角色的类的责任。即使只有一个 reducer,您仍然需要一个分区器来将键/值对分配给那个 reducer。

任何默认值或 if-there's-only-one-reducer 逻辑的存在都会有效地将分区分配行为分配到分区器之外的地方,这并不是真正好的 OO 设计。

【讨论】:

当你写“你仍然需要一个reducer来分配”时,你的意思是说“你仍然需要一个partitioner来分配”对吗?【参考方案2】:

在大多数情况下,即使您只有 1 个 reducer,不调用 partitioner 也会与调用它相同。但是如果抛出异常或程序由于其他原因崩溃,不调用分区程序可能会隐藏程序中的错误,这有点做作,因为您在分区程序中发现的任何错误很可能很容易在其他任何地方找到。由于调用它的成本非常低,因此没有理由不调用它,因此不调用它真的没有任何好处。

【讨论】:

我无法理解您所说的“不调用分区程序可能会隐藏程序中的错误,这有点做作,因为您在分区程序中发现的任何错误都可能很容易在任何地方找到else”你能举个例子吗?,但我同意那里的最后一行。 @Sudarshan 如果不调用分区器,它可能会改变程序的行为,IMO 这意味着它应该始终被调用

以上是关于为啥即使使用单个 reducer 也会调用 Partitioner的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使调用 Close(),等待 ManualResetEvent 的线程也会继续等待?

为啥即使服务仍然引用它,也会在 DataContract 上调用 Dispose?

为啥即使在调用 UpdateWindow() 之后绘制消息也会丢失?

为啥即使在我们调用其余调用的同一台服务器上运行 Angular 应用程序也会出现 cors 问题

为啥即使没有 SVN 更改,Jenkins 也会触发 IVY 构建?

为啥即使使用 QThreadPool,GUI 也会冻结?