2017-11-13 5 views
2

私は2つの結合を行う基本的なスパークジョブを持っています。結合される3つのデータフレームはいくぶん大きく、それぞれに約20億レコードあります。私は必要に応じてノードを自動的に拡大するスパークインフラを持っています。これは非常に単純なスパークSQLクエリのように思えますが、結果はディスクに書き込まれます。しかし、私がスパークUIから見ると、仕事は常に99%で立ち往生します。私が試してみました、物事のスパークジョブが99%でスタックし続けていない

バンチは以下のとおりです。

  • executorsexecutor memoryの数を増やします。
  • repartitionを使用してファイルを書き込みます。
  • 代わりspark SQL joinなど

のネイティブスパークjoinを使用ししかし、これらの事のどれも働いていません。誰かがこの問題を解決する経験を分かち合うことができれば幸いです。前もって感謝します。

答えて

1

ジョイン操作のため、同じキーを持つすべてのレコードが同じエグゼキュータにシャッフルされます。データが歪んでいる場合は、行数に関して非常に支配的な1つまたは少数のキーがあることを意味します。そして、これらのすべての行を処理しなければならない単一のエグゼキュータ。基本的にSparkの仕事はシングルスレッドになります。この単一のキーはシングルスレッドで処理する必要があるからです。

再編成は、結合操作が結合キーをハッシュすることによってデータを再びシャッフルするため、助けになりません。不運なハッシュの場合には、パーティションの数を増やすことができます。

このビデオでは、問題を説明し、解決策を示している:、 https://www.youtube.com/watch?v=6zg7NTw-kTQ

乾杯をFokko

関連する問題