1

这是用例:

输入 url 由地图读取,然后在一些过滤后发出。然后分区器根据它们的主机名对它们进行分区。

运行 map-reduce 作业后,我对输出 url 有一个全局限制。我将它均匀地分布在所有减速器上。IE。如果全局限制为 1000,reducer 的数量为 5,那么每个 reducer 最多会发出 (1000/5 = 200) 个 url 作为输出

问题是,如果只有 2 个主机的 url(由于用户输入)并且这 2 个主机中的每一个都有 100000 个 url,则处理这些 url(相同主机,相同分区)的 2 个 reducer 将每个限制为 200 个 url输出。由于分区和发出 0 条记录,Rest reducer 不会获取任何数据进行处理。

因此,即使我有 100000 个 url/主机和 1000 的全局限制,输出也只有 400 个 url(200 个 url/主机)。

4

2 回答 2

1

Hadoop 内置了对全局计数器的支持。您可以定义自己的计数器,并从映射器或缩减器代码中递增/读取它们。

于 2012-04-05T09:14:32.373 回答
1

如果您不必按主机名分区,则可以通过随机分区器解决您的问题。

如果您必须按主机名进行分区,我认为没有任何简单的答案。每个 reducer 都不知道有多少记录即将到来。每个 reducer 必须累积 100000 条记录,或者与它接收到的一样多。您需要覆盖减速器中的清理功能。Reducers 需要在“清理”函数中相互交谈(也许通过计数器),并决定需要多少条记录,并且只在清理函数中写出记录。

你怎么看?

于 2012-04-05T15:33:49.337 回答