Low shuffle merge on Databricks | Databricks on AWS [2022/9/8時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
注意
ローシャッフルマージ(Low shuffle merge)はDatabricksランタイム9.0以降でサポートされています。Databricksランタイム10.3以降では正式提供(GA)となっており、Databricksランタイム9.0、9.1、10.0、10.2ではパブリックプレビューとなっています。プレビューを利用されているお客様にはDatabricksランタイム10.3以降に移行することをお勧めします。
MERGEは、Delta Lakeテーブルに対して同時にアップデート、インサート、デリートを実行するために使用されます。Databricksでは、シャッフルオペレーションのk座図を削減することで、一般的なワークロードのパフォーマンスを劇的に改善するために最適化されたMERGE
の実装をしています。
Databricksのローシャッフルマージは、修正されていない行と修正された行を一緒に処理するのではなく、より整流化された別の処理モードで変更されていない行を処理することで優れたパフォーマンスを提供します。これによって、シャッフルされるデータの量が劇的に削減され、パフォーマンスの改善につながります。また、ローシャッフルマージはMERGE
オペレーションを実行した後にユーザーがOPTIMIZE ZORDER BYコマンドを再実行する必要性も削減します。
最適化されたパフォーマンス
多くのMERGE
ワークロードはテーブルの比較的小規模な行のみをアップデートします。しかし、Deltaテーブルはファイル単位ベースでしかアップデートすることができません。MERGE
コマンドが特定ファイルに格納されている小規模の行をアップデート、デリートする必要がある場合、同じファイルに格納されている他のすべての行が変更されていない場合でも、処理と再書き込みを行う必要があります。ローシャッフルマージは、未編集の業の処理を最適化します。これまでは、これらの行は編集行と同じ様に処理され、複数のシャッフルステージと高価な計算処理を経由していました。ローシャッフルマージでは、未編集の行には、いかなるシャッフル処理、高価な処理や他のオーバーヘッドは追加されません。
最適化されたデータレイアウト
ローシャッフルマージでは、実行が高速化されることに加えて、後段のオペレーションでもメリットが生じます。以前のMERGE
実装では、未編集のデータのデータレイアウトも完全に変更されており、後段のオペレーションでの性能劣化を引き起こしていました。ローシャッフルマージは、ベストエフォートでZ-orderの最適化を含み、未編集のレコードの既存のデータレイアウトを保持しようとします。このため、ローシャッフルマージを用いることで、MERGE
コマンドを複数回実行したとしても、Deltaテーブルにおけるオペレーションのパフォーマンスの劣化は軽減されます。
注意
ローシャッフルマージは、編集されていない既存データのデータレイアウトを保持しようとします。更新あるいは新たに追加されたデータのデータレイアウトは最適化されていない場合がありますので、依然としてOPTIMIZE ZORDER BYコマンドコマンドを実行する必要が出てくる場合があります。
可用性
Databricksランタイム10.4以降ではデフォルトでローシャッフルマージは有効化されています。それ以前のローシャッフルマージをサポートしているDatabricksランタイムバージョンでは、Spark設定spark.databricks.delta.merge.enableLowShuffle
をtrue
に設定することで有効化することができます。Databricksランタイム10.4以降ではこのフラグは意味を持ちません。