以下是用例:
输入网址由地图读取,稍后会在过滤后发出。然后分区程序根据其主机名对它们进行分区。
运行map-reduce作业后,我对输出网址有全局限制。我将它均匀地分布在所有减速器上。 即。如果全局限制为1000且reducers数为5,那么每个reducer最多会发出(1000/5 = 200)urls作为输出
问题是,如果只有2个主机的网址(由于用户输入),并且这2个主机中每个主机都有100000个网址, 处理这些URL的2个reducer(相同的主机,相同的分区)将限制每个输出的200个url。 休息减少器由于分区而没有得到任何处理数据并发出0记录。
所以尽管我有100000个网址/主机和全局限制1000,但输出只有400个网址(200个网址/主机)。
答案 0 :(得分:1)
Hadoop内置了对全局counters的支持。您可以定义自己的计数器,并从mapper或reducer代码中增加/读取它们。
答案 1 :(得分:1)
如果您不必按主机名进行分区,则可以通过随机分区程序解决问题。
如果你必须按主机名进行分区,我认为没有任何简单的答案。每个reducer都不知道会有多少记录。每个reducer必须累积100000条记录或收到的数量。您需要覆盖reducer中的清理功能。 Reducers需要在“cleanup”函数中相互通信(通过计数器),并决定需要多少条记录,并只在清理函数中写出记录。
你觉得怎么样?