reduceByKey处理每个flatMap输出而不在GraphX中的键上聚合值

时间:2014-12-24 22:39:29

标签: scala mapreduce apache-spark spark-graphx

我在运行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的整个输出进行分组,并使用提供的函数处理每个Key(K)的值列表(Vs)。

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

请稍微澄清一下 我不能解决出错的问题,还是我理解flatMap和reduceByKey错了?

此致

马赫

1 个答案:

答案 0 :(得分:1)

在开始flatMap之前,无需生成reduceByKey的整个输出。事实上,如果您不使用flatMap的中间输出,最好不要生成它并可能节省一些内存。

如果您的flatMap输出包含'k' -> v1'k' -> v2的列表,则无需等到整个列表生成后才能通过v1v2mapMsgMerge。如果中间列表不是{0}},那么只要输出v1v2两个元组就可以合并为mapMsgMerge(v1, v2)v1v2用过的。

我不能很好地了解Spark调度程序的详细信息,以确定这是否是有保证的行为,但它看起来像是the original paper调用'流水线'的实例。的运作。