3

我在运行 GraphX 时遇到问题

val adjGraph= adjGraph_CC.vertices 
   .flatMap { case (id, (compID, adjSet)) => (mapMsgGen(id, compID, adjSet)) } 
      // mapMsgGen will generate a list  of msgs each msg has the form K->V

   .reduceByKey((fst, snd) =>mapMsgMerg(fst, snd)).collect   
      // mapMsgMerg will merge each two msgs  passed to it 

我期望 reduceByKey 做的是按键 (K) 对 flatMap 的整个输出进行分组,并使用提供的函数处理每个键 (K) 的值列表 (Vs)。

正在发生的是 flatMap 的每个输出(使用函数 mapMsgGen),它是 K->V 对(通常不是相同的 K)的列表,使用 reduceByKey 函数 mapMsgMerg 并在整个 flatMap 完成之前立即处理。

需要澄清一下,我不明白出了什么问题,还是我理解 flatMap 和 reduceByKey 错了?

问候,

马赫

4

1 回答 1

1

没有必要flatMap在开始之前产生整个输出reduceByKey。事实上,如果你不使用中间输出,flatMap最好不要生成它,这样可能会节省一些内存。

如果您flatMap输出的列表包含'k' -> v1并且'k' -> v2没有理由等到整个列表生成后才能传递v1和传递v2mapMsgMerge. 一旦这两个元组被输出v1并且v2可以组合为mapMsgMerge(v1, v2)andv1并且v2如果不使用中间列表则丢弃。

我不太了解 Spark 调度程序的详细信息,无法说明这是否是有保证的行为,但它似乎确实是原始论文所称的操作“流水线”的一个实例。

于 2014-12-25T20:41:31.147 回答