ローカルモードでsparkを使用していますが、単純な結合には時間がかかりすぎます。私はA(8列230万行)とB(8列120万行)という2つのデータフレームを取り出し、A.join(B,condition,'left')
を使ってそれらを結合し、最後にアクションを呼び出しました。 1つのジョブを3つのステージで作成し、それぞれ2つのデータフレームの抽出と1つのジョインにします。意外にも、データフレームAの抽出には約8分、データフレームBには1分かかる。数秒で参加できます。私の重要な構成設定は、次のとおりです。ローカルの[*] なぜローカルモードでスパークに参加するのが遅いですか?
- .serializer org.apache.spark.serializer.KryoSerializer
- spark.sql.shuffle.partitions 16
唯一のエグゼキュータはドライバそのものです。データフレームを抽出しているうちに、32(16,64,50,100,200も試してみました)のパーツを分割しました。私は、データフレームA抽出を使用してステージに100 MBのシャッフル書き込みメモリを見ました。だからシャッフルを避けるために、私は両方のデータフレームとブロードキャストデータフレームB(小さい)のための16の初期パーティションを作ったが、それは助けにはならない。まだメモリがシャッフルされています。私はこのためにbroadcast(B)
構文を使用しました。 何か間違っていますか?なぜシャッフリングがまだそこにあるのですか?また、イベントタイムラインが表示されているときは、4つのコアだけが任意の時点で処理されています。私は2core * 4プロセッサーマシンを持っていますが。 なぜそうですか?短い、「参加」< =>シャッフルで
入力の大きさは何ですか? – Yaron
データフレームAには280MB、Bには140MB相当のものがあります –
これは非常に小さなデータセットです...多分これでしょうか? https://bzhangusc.wordpress.com/2015/06/10/why-your-join-is-so-slow/ – mathtick