2016-12-25 1 views
2

ローカルモードでsparkを使用していますが、単純な結合には時間がかかりすぎます。私はA(8列230万行)とB(8列120万行)という2つのデータフレームを取り出し、A.join(B,condition,'left')を使ってそれらを結合し、最後にアクションを呼び出しました。 1つのジョブを3つのステージで作成し、それぞれ2つのデータフレームの抽出と1つのジョインにします。意外にも、データフレームAの抽出には約8分、データフレームBには1分かかる。数秒で参加できます。私の重要な構成設定は、次のとおりです。ローカルの[*] なぜローカルモードでスパークに参加するのが遅いですか?

  • spark.driver.cores 8
  • spark.executor.memory 30グラム
  • spark.driver.memory 30グラム
  • スパークspark.master

    1. .serializer org.apache.spark.serializer.KryoSerializer
    2. spark.sql.shuffle.partitions 16

    唯一のエグゼキュータはドライバそのものです。データフレームを抽出しているうちに、32(16,64,50,100,200も試してみました)のパーツを分割しました。私は、データフレームA抽出を使用してステージに100 MBのシャッフル書き込みメモリを見ました。だからシャッフルを避けるために、私は両方のデータフレームとブロードキャストデータフレームB(小さい)のための16の初期パーティションを作ったが、それは助けにはならない。まだメモリがシャッフルされています。私はこのためにbroadcast(B)構文を使用しました。 何か間違っていますか?なぜシャッフリングがまだそこにあるのですか?また、イベントタイムラインが表示されているときは、4つのコアだけが任意の時点で処理されています。私は2core * 4プロセッサーマシンを持っていますが。 なぜそうですか?短い、「参加」< =>シャッフルで

  • +0

    入力の大きさは何ですか? – Yaron

    +0

    データフレームAには280MB、Bには140MB相当のものがあります –

    +0

    これは非常に小さなデータセットです...多分これでしょうか? https://bzhangusc.wordpress.com/2015/06/10/why-your-join-is-so-slow/ – mathtick

    答えて

    1

    、ここでの大きな問題は、どのように均一にあなたのデータは、パーティション上に分散されている(例えば、https://0x0fff.com/spark-architecture-shuffle/を参照、https://www.slideshare.net/SparkSummit/handling-data-skew-adaptively-in-spark-using-dynamic-repartitioningとGoogleだけの問題)です。効率を改善する いくつかの可能性:

    • は賢くデータ(AとB)とパーティションデータの詳細について考えます。
    • あなたのデータは歪んでいますか?
    • UIに入ると、タスクのタイミングを見て、
    • データセットからわずか数パーティションBのいくつかのパーティションを持つシャッフル中に「参加」パーティションのそのようなキーを選択してください。
    関連する問題