假设我们有10个数据点和5个映射器,目标是计算点之间的距离。通常,通过将每两对比较在一起,这需要O(N ^ 2)。
我想要做的是将包含数据点的整个文件加载到每个映射器,并使每个映射器在不同的点上运行。例如,让映射器#1计算点1和点2与所有其他点的距离,映射器#2计算点3和点4与所有其他点的距离,依此类推。
我在一篇论文中遇到过这个算法,但没有具体的方法来实现它。 有关如何将整个文件加载到每个映射器的任何想法或建议,或者如何使每个映射器通过该文件对特定索引进行操作,将非常感激。
答案 0 :(得分:0)
看一下this paper,建议使用"块嵌套循环"加入(第3部分),与您的要求略有不同,但可以轻松扩展以满足您的需求。如果您将R和S都视为一个来源,那么最后,它会根据您的需要将所有点与所有其他点进行比较。
根据您的要求,您不需要实施仅保留前k个结果的第二个MapReduce作业。
在hadoop 1.2.0(旧API)中,您可以使用conf.get("mapred.map.tasks")
命令和当前映射器,使用conf.get("mapred.task.partition")
命令获取映射器的总数。
但是,要回答有关如何为所有地图制作者获取相同文件的问题,可以使用Distributed Cache。