【问题标题】:Creating more partitions than reducers创建比 reducer 更多的分区
【发布时间】:2013-06-27 01:38:09
【问题描述】:

在我的单机本地开发时,我相信默认的 reducer 数量是 6。在特定的 MR 步骤中,我实际上将数据划分为 n 个分区,其中 n 可以大于 6。根据我的观察,看起来只有 6 个分区实际上得到了处理,因为我只看到 6 个特定分区的输出。几个问题:

(a) 是否需要将reducer 的数量设置为大于partition 的数量?如果是这样,我可以在运行 Mapper 之前/期间/之后执行此操作吗?

(b) 为什么其他分区没有排队?有没有办法在处理另一个分区之前等待reducer完成处理一个分区,这样无论reducer的实际数量是否小于分区数,都可以处理所有分区?

【问题讨论】:

  • 这里的启示是多个分区可以散列到同一个reducer。

标签: hadoop hadoop-streaming hadoop-partitioning


【解决方案1】:

(a) 不可以。您可以根据需要拥有任意数量的减速器。分区只是决定哪一组键/值对将进入哪个reducer。它不决定将生成多少个减速器。但是,如果您想根据需要设置减速器的数量,您可以通过 Job 来实现:

job.setNumReduceTasks(2);

(b) 这就是实际发生的情况。根据插槽的可用性,启动一组 reducer,处理所有输入给它们的输入。如果所有 reducer 都已完成,并且仍有一些数据未处理,则第二批 reducer 将启动并完成其余数据。无论分区和减速器的数量如何,您的所有数据最终都会得到处理。

请确保您的分区逻辑正确。

附: : 为什么你认为默认的 reducer 数量是 6?

【讨论】:

  • 我相信 reducer 的默认数量是 6,因为 numReduceTasks 是 6。
  • numReduceTasks 是您在工作中指定的。默认是指框架使用的东西,如果用户没有指定任何东西。
【解决方案2】:

您还可以在向 hadoop 提交作业时要求使用多个 reducer。 $hadoop jar myjarfile mymainclass -Dmapreduce.job.reduces=n myinput myoutputdir

有关更多选项和一些详细信息,请参阅: Hadoop Number of Reducers Configuration Options Priority

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多