2016-10-24 8 views
1

大きな入力データ〜800GBの5つの中サイズのテーブル(それぞれ〜80GB)を結合する必要があります。すべてのデータはHIVEテーブルにあります。 これを達成するためにSpark SQL 1.6.1を使用しています。 --num-executors 20 --driver-memory 40g --executor-memory 65g --executor-cores 6で参加には40分ほどかかります。すべての結合は、ソートマージ外部結合です。また、多くのシャッフルが起こっているのを見ている。Spark SQL結合のシャッフルを避けるためにデータを物理的に分割する方法

ハイブのすべてのテーブルを同数のバケットにバケットして、データ自体を最初にロードするときに、すべてのテーブルの類似のキーが同じスパークパーティションに移動するようにしました。しかし、スパークはバケットを理解していないようです。

&ソートデータをハイブ(パーツファイルなし)で分割できるため、スパイクはハイブ自体からデータをロードしている間にパーティション化キーを知り、データをシャッフルせずに同じパーティショニングで結合します周り?これにより、ハイブからデータをロードした後に、再パーティショニングを追加することがなくなります。

答えて

0

まず最初に、Spark Sql 1.6.1はハイブバケットをまだサポートしていません。 この場合、Sparkレベルの操作が残っているため、データをロードするときにすべてのテーブルを同じスパークパーティションに移動する必要があります。 Spark APIは、再分割とsortWithinPartitionsを提供して、これを実現します。例えば

ヴァルパート1 = df1.repartition(DF1(「キー1」))。sortWithinPartitions(DF1(「キー1」))あなたは残りのテーブルのパーティションの世代のために行くことができると同じように

と参加しましたそれらはパーティション内でソートされたキー上にあります。

これにより、結合はシャッフルフリーになりますが、計算コストが高くなります。データフレームをキャッシュすると(新しく作成されたパーティションのキャッシュ操作のために行くことができます)、後続の操作が実行される場合にはより良いパフォーマンスが得られます。この助けを願っています。

関連する問題