Hadoop 限制所有还原程序共同生成的记录数

Hadoop 限制所有还原程序共同生成的记录数,hadoop,mapreduce,nutch,Hadoop,Mapreduce,Nutch,以下是用例: 输入URL由映射读取,然后通过一些过滤发出。然后分区器根据主机名对它们进行分区 在运行map reduce作业后,我对输出URL有一个全局限制。我将其均匀分布在所有减速器上。 也就是说,如果全局限制为1000,并且减缩器的数量为5,那么每个减缩器最多将发出(1000/5=200)URL作为输出 问题是,如果只有来自2台主机的URL(由于用户输入),并且这2台主机中的每台主机都有100000个URL, 处理这些URL(同一主机、同一分区)的两个还原程序将限制每个URL仅输出200个U

以下是用例:

输入URL由映射读取,然后通过一些过滤发出。然后分区器根据主机名对它们进行分区

在运行map reduce作业后,我对输出URL有一个全局限制。我将其均匀分布在所有减速器上。 也就是说,如果全局限制为1000,并且减缩器的数量为5,那么每个减缩器最多将发出(1000/5=200)URL作为输出

问题是,如果只有来自2台主机的URL(由于用户输入),并且这2台主机中的每台主机都有100000个URL, 处理这些URL(同一主机、同一分区)的两个还原程序将限制每个URL仅输出200个URL。 Rest还原程序由于分区而无法获取任何数据进行处理,并发出0条记录


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

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

如果不必按主机名进行分区,您可以使用随机分区器解决问题

如果必须按主机名进行分区,我认为没有任何简单的答案。每个减速机都不知道会有多少记录。每个减速机必须累积100000条记录,或其接收的记录数。您需要覆盖减速器中的清理功能。还原程序需要在“cleanup”函数中相互通信(可能通过计数器),决定需要多少记录,并且只在cleanup函数中写出记录


你觉得怎么样?

谢谢。我将尝试使用计数器。我认为维护计数器(以共享变量的方式)会影响较大输入的性能,但目前我没有任何选择。我必须按主机名进行分区,因为来自同一主机的URL被分组在一起,从而简化了进一步的逻辑。清理功能是hadoop map减少流量的一部分还是您建议的机制?请详细说明。您可以在reducer类中覆盖此函数。在reduce函数中,您应该将记录存储在容器中,而不是将其写出。在cleanup函数中,您可以进行通信,并决定当前reducer需要写出多少条记录。在以下页面中查找清除函数: