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 が行うことを期待していたのは、flatMap の出力全体をキー (K) でグループ化し、提供された関数を使用して各キー (K) の値のリスト (Vs) を処理することです。

何が起こっているかというと、flatMap (関数 mapMsgGen を使用) の各出力です。これは、K->V ペア (通常は同じ K ではありません) のリストであり、reduceByKey 関数 mapMsgMerg を使用して、flatMap 全体が終了する前にすぐに処理されます。

明確化が必要です。何が問題なのかわかりませんか、それともflatMapとreduceByKeyが間違っていることを理解していますか??

よろしく、

マヘル

4

1 に答える 1

1

flatMapを開始する前にの出力全体を生成する必要はありませんreduceByKey。実際、 の中間出力を使用していない場合は、中間出力flatMapを生成しない方がよいため、メモリを節約できる可能性があります。

flatMapを含むリストを出力し、リスト'k' -> v1全体が生成されて渡される'k' -> v2まで待つ理由がない場合。これらの 2 つのタプルが出力されるとすぐに、中間リストが使用されていない場合は andとして結合され、破棄されます。 v1v2mapMsgMergev1v2mapMsgMerge(v1, v2)v1v2

これが保証された動作であるかどうかを判断するのに十分なほど、Spark スケジューラの詳細はわかりませんが、元の論文で操作の「パイプライン化」と呼ばれるもののインスタンスのように思えます。

于 2014-12-25T20:41:31.147 に答える