以下是用例:
输入url由映射读取,然后在经过一些过滤后发出。然后分区器根据它们的主机名对它们进行分区。
在运行map reduce作业后,我对输出url有一个全局限制。我把它均匀地分布在所有减速器上。即,如果全局限制为1000,减少器的数量为5,则每个减少器最多会发出(1000/5=200)个url作为输出
问题是,如果只有来自2个主机的url(由于用户输入)并且这2个主机中的每一个都有100000个url,处理这些url的2个reducer(同一主机、同一分区)将限制每个url只能输出200个url。由于分区的原因,Rest reducers无法获得任何数据进行处理,并发出0条记录。
所以,尽管我有100000个urls/host,全局限制为1000,但输出只有400个urls/主机(200个urls/host)。
如果不必按主机名进行分区,则可以通过随机分区器来解决问题。
如果必须按主机名进行分区,我认为没有任何简单的答案。每个减速器都不知道会有多少记录。每个reducer必须累积100000条记录,或者与它接收到的记录一样多。您需要覆盖减速器中的清理功能。Reducer需要在"cleanup"函数中相互交谈(可能通过计数器),并决定需要多少记录,只在cleanup函数中写出记录。
你觉得怎么样?