CollectAsMapがSparkでどのように機能するか知りたいのですが。具体的には、すべてのパーティションのデータの集約がどこで行われるのか知りたいですか?集約は、マスターまたはワーカーのいずれかで行われます。最初のケースでは、各ワーカーがマスターでデータを送信し、マスターが各ワーカーからデータを収集すると、マスターは結果を集約します。 2番目のケースでは、ワーカーは結果を集約する責任があり(データを交換した後)、その後、結果はマスターに送信されます。
マスターがワーカーがデータを交換することなく、各パーティションから個別にデータを収集できるようにする方法を見つけることが重要です。
ここで、彼らがcollectAsMapをどのように行っているかを確認できます。 RDDタイプはタプルであるため、通常のRDD収集を使用してから、タプルをキーと値のペアのマップに変換するように見えます。ただし、コメントにはマルチマップはサポートされていないことが記載されているため、データ全体で1対1のキー/値マッピングが必要です。
Collectが行うことは、Sparkジョブを実行し、ワーカーから各パーティションから結果を取得し、ドライバーのreduce/concatフェーズでそれらを集約することです。
したがって、ドライバーは、ワーカーがデータを交換してcollectAsMap
を実行することなく、各パーティションからデータを個別に収集する必要があります。
collectAsMap
を使用する前にRDDで変換を実行してシャッフルを発生させる場合は、ワーカー間でデータを交換する中間ステップが存在する可能性があることに注意してください。クラスターマスターのアプリケーションUIをチェックして、sparkがアプリケーションを実行している方法に関する詳細を確認してください。
まず、両方の操作で、RDDに存在するすべてのデータは、さまざまなエグゼキュータ/ワーカーからマスター/ドライバーに移動します。 collectとcollectAsMapはどちらも、さまざまなエグゼキュータ/ワーカーからのデータを照合するだけです。 SOこれが、他のオプションがない場合を除いて、collectを使用しないことが常に推奨される理由です。
これは、パフォーマンスの観点から考慮しなければならない最後のコレクションであると言わなければなりません。
よろしく、
ニーラジ
上記の回答をサポートします。
collectAsMap()
-キーと値のペアを辞書として返します(countByKey()
は辞書を返す別の関数です)。
collectAsMap()
、Collect()
、take(n)
、takeOrdered(n)
、takeSample(False,..)
これらのメソッドは、すべてのデータをドライバーにもたらします。プログラマーは、本番環境でそれらを使用する際に注意を払う必要があります。