Databricks Certified Data Engineer Associate 教科書
第6章 トラブルシューティング・監視・最適化(Troubleshooting, Monitoring, and Optimization, 10%)
🎯 この節の学習目標
CLUSTER BY)の仕組みと、静的パーティショニング・ZORDER に対する利点(キー変更の容易さ・スキュー耐性)を説明できるCLUSTER BY AUTO(自動クラスタリング)とPredictive Optimizationがそれぞれ何を自動化するのかを区別できる6-2 では実行中のクエリのボトルネックを診断しました。しかし、クエリが遅い原因はしばしばデータの置き方(レイアウト)にあります。テーブルをスキャンするとき、Delta Lake はファイルごとの統計情報(各列の最小値・最大値)を使って「読む必要のないファイル」を丸ごと飛ばします(データスキッピング)。フィルタ条件に使う列の値が近い行同士を同じファイルにまとめて配置できていれば、このスキップが強力に効きます。逆に値が散らばっていると、ほぼ全ファイルを読む羽目になります。
この「よく使う列で行を物理的に寄せて配置する」ための手法が、従来は静的パーティショニング(PARTITIONED BY)と ZORDER でした。そして現在 Databricks が推奨するのが Liquid Clustering です。
| 手法 | 仕組み | 弱点 |
|---|---|---|
| 静的パーティショニング ( PARTITIONED BY) | 指定列の値ごとに物理ディレクトリを分割する | キーは作成後に変更できない(変更にはテーブル全体の書き直しが必要)。高カーディナリティ列は不可(パーティション=小ファイルが爆発する)。値の偏りがそのままファイルサイズの偏りになる |
| ZORDER ( OPTIMIZE ... ZORDER BY) | OPTIMIZE 実行時に、指定列の値が近い行を同じファイルに並べ替える | OPTIMIZE のたびに全面的な書き直しが起きやすくコストが高い。新規データは次の OPTIMIZE まで最適化されない。キー変更のたびに再実行が必要で、増分的でない |
つまり従来は、「パーティション列を何にするか」をテーブル設計の最初に当てなければならず、外すと後から直すのが大変でした。クエリパターンは運用の中で変わっていくのに、レイアウトが固定的だったのです。
Liquid Clustering は、静的パーティショニングと ZORDER の両方を置き換える、Delta テーブルのデータレイアウト方式です。テーブル作成時に CLUSTER BY でクラスタリングキーを指定します。
💡 具体例:Liquid Clustering テーブルの作成とキー変更
-- 作成時にクラスタリングキーを指定
CREATE TABLE sales (
order_id BIGINT,
customer_id BIGINT,
order_date DATE,
amount DOUBLE
)
CLUSTER BY (order_date, customer_id);
-- クエリパターンが変わったら、キーは後から変更できる
ALTER TABLE sales CLUSTER BY (customer_id);
-- キーの指定自体を Databricks に任せる(自動クラスタリング)
CREATE TABLE events (...) CLUSTER BY AUTO;
変更後のキーは以降に書き込まれるデータに適用され、既存データは OPTIMIZE の実行に伴い増分的に再クラスタリングされます。全面書き直しを強制されない点が ZORDER との大きな違いです。
Liquid Clustering の特長を整理します。
ALTER TABLE ... CLUSTER BY だけで変更でき、テーブルの書き直しは不要です。クエリパターンの変化に追従できます。CLUSTER BY AUTO(自動クラスタリング) — キー選定そのものを Databricks に委ねる指定です。実際のクエリワークロードを分析して最適なクラスタリングキーを自動選択・自動調整します(Predictive Optimization が有効な Unity Catalog 管理テーブルで利用)。「どの列で絞り込まれるか事前に読めない」テーブルに適します。📝 試験のポイント
選択肢の見分け方:「高カーディナリティ列でよくフィルタされる」「クラスタリングキーを後から変更したい」「データの偏り(スキュー)があるテーブル」という条件が出たら、静的パーティショニングや ZORDER ではなく Liquid Clustering(CLUSTER BY)が正解側です。逆に Liquid Clustering と静的パーティションは併用できない(同一テーブルで PARTITIONED BY と CLUSTER BY は同時指定不可)ことも覚えておきましょう。
レイアウトを決めても、テーブルには継続的なメンテナンスが必要です。従来は次の作業をエンジニアが手動またはジョブのスケジュールで運用してきました。
OPTIMIZE — 小ファイルを適正サイズに統合(コンパクション)し、クラスタリングを進めるVACUUM — 不要になった古いデータファイルを削除し、ストレージコストを削減するPredictive Optimization は、これらのメンテナンス操作を Databricks が自動で判断・実行する機能です。対象は Unity Catalog の管理テーブル(managed table)で、各テーブルの利用パターンとデータの状態を分析し、「最適化する価値があるテーブルに、価値があるタイミングで」OPTIMIZE や VACUUM をサーバーレスコンピュート上で実行します。
| 観点 | 手動メンテナンス | Predictive Optimization |
|---|---|---|
| 実行の判断 | エンジニアがスケジュールを設計・調整 | Databricks が利用状況から自動判断 |
| 実行基盤 | 自前のジョブクラスタ等を用意 | サーバーレスコンピュートで自動実行 |
| 対象 | 任意のテーブル | Unity Catalog 管理テーブル |
| リスク | 実行し忘れ・過剰実行(無駄なコスト)が起きうる | 必要なテーブルにだけ実行され、運用負荷が下がる |
📝 試験のポイント
「OPTIMIZE や VACUUM を実行するジョブの管理をやめて、運用負荷を減らしたい」という要件には Predictive Optimization が対応します。前提条件としてUnity Catalog の管理テーブルであることがセットで問われる点に注意してください。外部テーブル(external table)は対象外です。また、役割の違いとして「Liquid Clustering=データの並べ方(レイアウト)」「Predictive Optimization=メンテナンス(OPTIMIZE/VACUUM)の自動実行」という軸で区別しましょう。両者は排他ではなく、組み合わせて使うものです。
| 観点 | 静的パーティション | ZORDER | Liquid Clustering |
|---|---|---|---|
| キーの変更 | 不可(全書き直し) | OPTIMIZE 再実行で変更可(高コスト) | ALTER TABLE で容易 |
| 高カーディナリティ列 | 不向き(小ファイル爆発) | 可 | 可 |
| データの偏りへの耐性 | 弱い(巨大パーティション化) | 中程度 | 強い(ファイルサイズを平準化) |
| 最適化の方式 | 書き込み時に固定 | OPTIMIZE 時に全面的に並べ替え | 増分的に再クラスタリング |
| 運用の自動化 | 手動設計 | 手動実行が前提 | CLUSTER BY AUTO + Predictive Optimization でキー選定もメンテナンスも自動化可 |
新規に作る Delta テーブルでは、特別な理由がない限り Liquid Clustering を第一候補とし、Unity Catalog 管理テーブルであれば Predictive Optimization を有効にして OPTIMIZE / VACUUM の運用を手放す、というのが現在の推奨構成です。既存の試験問題や現場のテーブルには静的パーティションや ZORDER も残っているため、それぞれの弱点(=Liquid Clustering が解決した点)を対比で覚えるのが効率的です。
✅ この節のまとめ
CLUSTER BY)はキーの後からの変更が容易で、高カーディナリティ列にも使え、スキューに強く、増分的にクラスタリングされる。CLUSTER BY AUTO ならキー選定も自動化できる。問1. 数十億行のイベントテーブルは、値の種類が非常に多い user_id 列でフィルタされることが多い。また、分析ニーズの変化により絞り込みに使う列が今後変わる可能性がある。データレイアウトとして最も適切なのはどれか。
正解:B
「高カーディナリティ列でのフィルタ」と「キーが将来変わりうる」という2条件は、どちらも Liquid Clustering の得意分野です。Aは user_id の値ごとにパーティションが作られ、膨大な小ファイル・小ディレクトリが発生するため不適切です。Cはデータスキッピングがほとんど効かず、スキャン量が過大になります。Dは user_id での絞り込みという主要クエリパターンを最適化できていません。
問2. Predictive Optimization の説明として正しいものはどれか。
正解:B
Predictive Optimization は Unity Catalog 管理テーブルの利用状況を分析し、価値のあるタイミングで OPTIMIZE / VACUUM をサーバーレス基盤上で自動実行する機能です。Aは AQE(Adaptive Query Execution)の説明です(6-2 参照)。Cは対象が誤りで、外部テーブルは Predictive Optimization の対象外です。Dはオートスケーリングの説明です。
問3. ZORDER と比較したときの Liquid Clustering の利点として最も適切なのはどれか。
正解:B
キー変更の容易さと増分的なクラスタリングが、OPTIMIZE のたびに大規模な並べ替えが必要な ZORDER に対する代表的な利点です。Aは誤りで、Liquid Clustering もデータスキッピング(ファイル統計)を活用して読むファイルを減らします。Cも誤りで、既存データの再クラスタリングは OPTIMIZE の実行(または Predictive Optimization による自動実行)を通じて進みます。Dは誤りで、同一テーブルに PARTITIONED BY と CLUSTER BY は同時指定できません。
問4. データエンジニアリングチームは、数百の Delta テーブルに対する OPTIMIZE と VACUUM のスケジュールジョブの管理に手間がかかっている。テーブルは Unity Catalog の管理テーブルである。運用負荷を最も削減できる方法はどれか。
正解:B
Unity Catalog 管理テーブルという前提が揃っているため、Predictive Optimization の有効化でメンテナンスジョブの設計・スケジュール管理そのものを手放せます。Aはジョブ管理の手間が減らないうえ、不要な実行によるコスト増を招きます。Cは逆効果で、外部テーブルは Predictive Optimization の対象外になります。Dは危険な設定で、実行中のクエリやタイムトラベルが参照するファイルまで削除されるおそれがあり、運用負荷の削減とも無関係です。