Disco/MapReduce:将前次迭代结果作为新迭代输入
我现在正在Disco上实现PageRank算法。这个算法是一个迭代过程,每次迭代的结果会作为下一次迭代的输入。
我有一个很大的文件,里面包含了所有的链接,每一行代表一个页面,行中的值表示这个页面链接到哪些其他页面。
对于Disco,我把这个文件分成N个部分,然后用MapReduce进行一轮处理。结果我得到了一个(页面,排名)的数据集。
我想把这个排名传递给下一轮迭代。但是,现在我的映射器需要两个输入:图文件和页面排名。
- 我想把图文件和页面排名“压缩”在一起,这样每一行就能表示一个页面、它的排名和它的出链。
- 因为这个图文件被分成了N个部分,我需要把页面排名向量也分成N个并行的部分,然后把这些页面排名向量的区域和图的部分结合在一起。
这一切看起来比必要的要复杂,而且作为一个相对简单的操作(用经典的MapReduce算法),我觉得我可能遗漏了Disco的一些东西,这样可以让这个过程变得更简单。
有什么想法吗?
1 个回答
1
看起来你需要在第一次运行时使用一个叫做init_map的东西,然后在后续的每次运行中使用iter_map。
可以参考这个链接: http://discoproject.org/doc/faq.html#id7
你能输出一个包含外部链接的Python对象吗,而不仅仅是(页面,排名)这样的元组?
另外一个选择是把外部链接存储在某个地方,并用页面作为键(比如字典、内存缓存、kyotocabinet等),然后在映射函数中查找它们。如果你在用Disco串联处理,我觉得你不想在工作流程的中间把东西压缩在一起。