我在运行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错了?此致
马赫
答案 0 :(得分:1)
在开始flatMap
之前,无需生成reduceByKey
的整个输出。事实上,如果您不使用flatMap
的中间输出,最好不要生成它并可能节省一些内存。
如果您的flatMap
输出包含'k' -> v1
和'k' -> v2
的列表,则无需等到整个列表生成后才能通过v1
和v2
到mapMsgMerge
。如果中间列表不是{0}},那么只要输出v1
和v2
两个元组就可以合并为mapMsgMerge(v1, v2)
和v1
和v2
用过的。
我不能很好地了解Spark调度程序的详细信息,以确定这是否是有保证的行为,但它看起来像是the original paper调用'流水线'的实例。的运作。