DatabricksでSparkとDelta Lakeワークロードを最適化するための包括的ガイド

[Comprehensive Guide to Optimize Data Workloads \| Databricks](https://www.databricks.com/discover/pages/optimize-data-workloads-guide)の翻訳です。

:::note warn
- 本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
- 2023年時点の内容です。一部情報が古いものがあります。
:::

# イントロダクション

このドキュメントは、基本的なDatabriks、Apache Spark™、Delta Lakeのベストプラクティスと最適化テクニックのほぼ全てを一つの箇所にまとめることを狙いにしています。全てのデータエンジニアとデータアーキテクトは、最適化され、コスト効率が高く、効率的なデータパイプラインを設計、構築する際に活用することができます。コストは後付けのものとして考えるべきではなく、プロジェクト導入の際の最も重要な非機能要件として考えるべきです。このため、本書で議論されるベストプラクティスの全ては、データパイプラインの開発と本格運用時を通じて考慮されるべきです。本書はいくつかのセクションに分割っされ、それぞれが特定の問題定義にフォーカスし、それに対する全てのソリューションにディープダイブします。

![](https://www.databricks.com/en-website-assets/static/d69d89624cb5584bd64386d54c6818ee/22587.png)

# Delta Lake - レイクハウスのフォーマット

Delta Lakeはあなたのデータレイクに信頼性、セキュリティ、パフォーマンスを提供するオープンフォーマットのストレージレイヤーです。Spark、PrestoDB、Flink、Trino、Hiveを含む計算エンジンとともに[レイクハウスアーキテクチャ](http://cidrdb.org/cidr2021/papers/cidr2021_paper17.pdf)の構築を可能にし、Python、SQL、Scala、Java、Rust、RubyのAPIを提供します。Parquet、Avro、ORCなどの他のオープンフォーマットと比べて、以下のように数多くのメリットを提供します。

- Deltaは、オープンソースのParquetフォーマットをベースとした、ACIDトランザクション、高パフォーマンス、その他の多数の機能を保証するプロトコルです。Deltaは[オープンソース](https://delta.io/)であり、[こちら](https://github.com/delta-io/delta/blob/master/PROTOCOL.md)からわかるように完全なプロトコルです。
- Delta LakeはACIDトランザクションをサポートしており、バッチとストリーミングのパラダイムを統合し、インクリメンタルなデータに対するdelete/insert/updateのトランザクション処理をシンプルにします。
- Deltaによって、タイムトラベルが可能となり、テーブルのポイントインタイムのスナップショットを読み込むことができます。
- また、Deltaは効率的なデータレイアウト、インデックス作成、データスキップ、キャッシュなどのパフォーマンスのエンハンスメントを提供します。

このため、全てのメリットを享受するために、Deltaをデフォルトのデータレイクストレージフォーマットとして使用することを強くお勧めします。Databricks DBR 8.x以降では、Delta Lakeはデフォルトのフォーマットとなっています。

# 背後のデータレイアウト

https://qiita.com/taka_yayoi/items/f9bb8e4d538b2daacd4c

# データのシャッフル - なぜ起きるのか、どのようにコントロールするのか

https://qiita.com/taka_yayoi/items/cb2bcd316436a8d56139

# データの溢れ - なぜ起きるのか、どのように排除するのか

https://qiita.com/taka_yayoi/items/0fbe02b5f4cd6c0bb9a3

# データの偏り - 特定と対策

https://qiita.com/taka_yayoi/items/7fb43c9a363f68da7e69

# データの爆発 - 特定、結果とソリューション

https://qiita.com/taka_yayoi/items/b3146640c6ce2d6e9347

# データスキッピングとプルーニング

https://qiita.com/taka_yayoi/items/e2d0239f3609e677121e

# データのキャッシュ - ワークロードを高速にするためにキャッシュを活用

https://qiita.com/taka_yayoi/items/e226cf6fdc847beaa209

# 中間結果 - いつ永続化するのか

複数のSQLクエリーにまたがる大規模なパイプラインにおいては多くの場合、1つ以上の中間処理結果を保持する作業用(あるいは一時用、ステージング用)のDeltaテーブルを作りがちです。これによって、可読性やメンテナンス性を改善するために、大規模なクエリーを小規模なクエリーにブレークダウンすることができます。しかし、この戦略は以下の理由から、実行時間に対してネガティブなインパクトを与えます:

- クラウドストレージにステージングテーブルを書き込むので時間を要します。
- そして、以降のステップでクラウドストレージにあるステージングテーブルから読み戻すので、これもまた時間がかかります。

このため、マテリアライズされるDeltaテーブルではなく、[一時ビューを作成](https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-create-view.html#create-view)する方が優れたアプローチとなります。一時ビューは遅延評価され、実際にはマテリアライズされません。

```sql
CREATE OR REPLACE TEMP VIEW <view-name> AS SELECT col1, col2,... FROM <table-name>
```

![](https://www.databricks.com/sites/default/files/inline-images/alert-icon.png?v=1688736447)

- 中間テーブルが同じSparkジョブで一度しか使用されない場合には、一時ビューにしましょう。
- 同じSparkジョブで中間テーブルが2回以上使用される場合には、一時ビューはSparkに関連するクエリーを2回以上実行させることがあるため、一時ビューよりもDeltaテーブルにしておくべきです。このようなケースでは、スキャンを高速化するために、一時テーブルが自動的にワーカーのSSDドライブにキャッシュされるように、Deltaキャッシュが有効化されたワーカーインスタンスを使うことを強くお勧めします。

# Deltaのマージ処理 - スピードアップしましょう

https://qiita.com/taka_yayoi/items/ef6e8f2c97ae87878b08

# データのパージ - 古いデータをどうすべきか

https://qiita.com/taka_yayoi/items/30183da3e19e230cdc0b

# Delta Live Tables(DLT)

https://qiita.com/taka_yayoi/items/c2f5f93aef5113c05c12

# Databricksクラスターの設定とチューニング

https://qiita.com/taka_yayoi/items/040b13029ef92f8c365d

# まとめ

本書では、数多くのSpark、Delta、Databricksの最適化戦略と戦術をカバーしました。本書の目的は、分散コンピュート上でビッグデータワークロードを構築する際に遭遇することのある様々な課題と、そのような課題を特定するための手法やソリューションに気づいていただくことです。このようなガイドは、全ての企業がコストを削減し、少ないことでより多くのことをしようとしている現在の経済状況において、エンジニアリングのコストやSLAをコントロールし、クラウドリソースを最大限活用しようとしている、データエンジニアやデータアーキテクトを真にアシストするものです。

Databricksはデータ & AIカンパニーです。世界中で、Comcast、Condé Nast、Fortune 500の50%以上を含む9,000以上の企業が、自分たちのデータ、分析、AIを統合するためにDatabricksレイクハウスプラットフォームを活用しています。Databricksはサンフランシスコに本社があり、世界中にオフィスがあります。Apache Spark™、Delta Lake、MLflowのオリジナルクリエーターによって創業されました。Databrikcsのミッションは、データチームが世界で最も困難な問題を解決する助けとなることです。詳細は、Databricksの[Twitter](https://twitter.com/databricks)、[LinkedIn](https://www.linkedin.com/company/databricks)、[Facebook](https://www.facebook.com/databricksinc)をフォローしてください。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)