Databricksの面接では通常、Apache Spark(ジョブの実行方法、遅くなる理由)、Delta Lake(テーブルを信頼できるものにする仕組み)、そしてプラットフォーム(クラスター、ジョブ、ガバナンス)が混ざって出題されます。最も評価が高いのは、それぞれの概念を、スキューしたジョイン、小さなファイル、安全に再実行する必要があるパイプラインといった実際の問題に結びつける回答です。
Databricksは製品名の変更や再編をかなり頻繁に行うので、自分が使ったことのある名称(たとえばDelta Live Tables、現在はLakeflowファミリーの一部)を伝え、求人票でスタックを確認しましょう。
以下、回答付きの25問です。
プラットフォームとアーキテクチャ
1. Databricksとは何ですか。レイクハウスとは何ですか。
Databricksは、Apache Sparkを中心に構築されたクラウドデータ・AIプラットフォームです。レイクハウスは、データをクラウドオブジェクトストレージ上のオープンなフォーマットで保持しつつ、その上にウェアハウス並みの信頼性とガバナンスを加えたものです。これにより、1つのデータコピーでエンジニアリング、分析、機械学習に対応できます。
2. 汎用クラスター、ジョブクラスター、SQLウェアハウスの違いは何ですか。
汎用クラスターは対話的な作業や開発向けです。ジョブクラスターはスケジュールされたジョブのために起動し、終了後にシャットダウンするため、コストを抑えられます。SQLウェアハウスは、SQLやBIクエリに最適化されたコンピュートです。
3. コストはどのように管理しますか。
本番環境ではジョブクラスターを使い、対話型クラスターには自動終了を設定し、適切な上限付きのオートスケーリングを有効にし、インスタンスタイプを適切に選定し、耐障害性が求められる作業にはスポットインスタンスを使い、クラスターポリシーでユーザーが作成できる構成を制限し、コストレポート用にタグを付けます。
4. Unity Catalogとは何ですか。
データとAI資産のためのガバナンス層です。3階層の名前空間(カタログ、スキーマ、テーブル)を提供し、ワークスペースをまたいだ一元的なアクセス制御、リネージ、監査を可能にします。
Delta Lake
5. Delta Lakeとは何ですか。なぜプレーンなParquetではなくそれを使うのですか。
Delta Lakeは、Parquetファイルにトランザクションログを追加するテーブルフォーマットです。ACIDトランザクション、スキーマの強制と進化、タイムトラベル、効率的な更新と削除を実現します。プレーンなParquetにはトランザクションがないため、書き込みが失敗すると部分的なデータが残ることがあり、リーダーが不整合な状態を見てしまう可能性があります。
6. Deltaのトランザクションログはどのように機能しますか。
各コミットは_delta_logフォルダにJSONエントリを追加し、定期的にチェックポイントが作成されます。ログには、各バージョンでどのデータファイルがテーブルに含まれるかが記録されます。リーダーはこれを使って一貫したスナップショットを参照し、ライターは楽観的並行性制御を使い、別のコミットと競合した場合はリトライするか失敗させます。
7. タイムトラベルとは何ですか。
監査、デバッグ、ロールバックのために、バージョン番号やタイムスタンプを指定してテーブルの以前のバージョンをクエリすることです。
SELECT * FROM sales VERSION AS OF 12;
RESTORE TABLE sales TO VERSION AS OF 12;
8. Deltaでデータをアップサートするにはどうしますか。
MERGE INTOを使います。
MERGE INTO customers t
USING updates s ON t.id = s.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
ソース側でキーごとに1行だけになるようにしてください。そうでないと、マージが失敗したり誤った結果になったりします。
9. OPTIMIZEとVACUUMは何をしますか。
OPTIMIZEは多数の小さなファイルをより大きなファイルにコンパクションし、読み取りを高速化します。VACUUMは、テーブルから参照されなくなり、保持期間を超えたファイルを削除するため、ストレージを解放しますが、タイムトラベルできる範囲が制限されます。他のジョブがまだ古いバージョンを読む可能性があるうちは、保持期間を非常に短く設定しないでください。
10. クエリを高速化するためにデータをどのようにレイアウトしますか。
クエリで頻繁にフィルタされる低カーディナリティの列だけをパーティションに使い、パーティションは十分な大きさに保ちます。過度なパーティショニングは多数の小さなファイルを生みます。それ以外の列には、Zオーダーまたはリキッドクラスタリング(より新しいアプローチ)を使います。これらはデータをクラスタリングし、クエリがファイルをスキップできるようにします。
Sparkの基礎
11. トランスフォーメーションとアクションとは何か、また遅延評価とは何ですか?
filter や select のようなトランスフォーメーションはプランを構築するだけで、実行はされません。count や write のようなアクションが実行をトリガーします。Sparkはプラン全体を最初に把握できるため、それを最適化できます。
12. シャッフルとは何か、なぜコストが高いのですか?
シャッフルは、同じキーを持つ行を同じ場所に集めるために、ネットワークを介してエグゼキュータ間でデータを移動させる処理で、join、groupBy、distinct などで発生します。ディスクとネットワークのI/Oを伴うため、シャッフルを減らすことがジョブを高速化する主な道筋となります。
13. Sparkは2つのテーブルをどのように結合しますか、またどうすれば高速化できますか?
デフォルトでは、大規模な結合はシャッフル(ソートマージ)結合を使用します。片方のテーブルが小さければ、ブロードキャスト結合によってそれをすべてのエグゼキュータに送信し、大きなテーブルのシャッフルを回避できます。
from pyspark.sql.functions import broadcast
df = big.join(broadcast(small), "id")
14. データスキューとは何か、またどう修正しますか?
一部のキーがほとんどの行を保持するため、いくつかのタスクが他よりもはるかに長くかかります。兆候は、Spark UIで1つのタスクが長時間実行されていることです。修正方法は、適応的クエリ実行のスキュー処理、キーのソルティング、小さい側のブロードキャスト、またはスキューの原因となるnullやデフォルトキーの除外です。
15. 適応的クエリ実行(AQE)とは何ですか?
Sparkは実際の統計情報を用いて実行中にプランを調整します。小さなシャッフルパーティションの結合、結合戦略の切り替え、スキューしたパーティションの分割が可能です。最近のバージョンではデフォルトで有効になっています。
16. repartitionとcoalesceの違いは何ですか?
repartition はパーティションを増やすことも減らすこともでき、完全なシャッフルを行います。coalesce はパーティションを減らすだけで完全なシャッフルを回避するため、より低コストですが、パーティションが不均等になる可能性があります。
17. いつDataFrameをキャッシュすべきですか?
ジョブ内で同じDataFrameを何度も再利用し、再計算のコストが高い場合です。一度しか使わないものはキャッシュせず、使用後はキャッシュを解放します。
18. なぜPython UDFよりも組み込み関数を優先すべきなのですか?
組み込み関数はJVM内で実行され、最適化できます。Python UDFはJVMとPythonの間でデータを移動させ、オプティマイザからは不透明であるため、遅くなります。可能な限り組み込み関数やpandas UDFを使用してください。
パイプライン
19. メダリオンアーキテクチャとは何ですか?
階層化された設計です。ブロンズは生の取り込みデータを保持し、シルバーはクレンジングおよび統合されたデータを保持し、ゴールドはレポーティングにすぐ使えるビジネスレベルの集計を保持します。品質チェックがどこで行われるかが明確になり、後のレイヤーを前のレイヤーから再構築できます。
20. Auto Loaderとは何ですか?
クラウドストレージに新しいファイルが到着するたびに、それらを増分的かつ効率的に取り込み、処理済みのファイルを追跡する機能で、スキーマ推論と進化をサポートします。
21. Structured Streamingは障害とexactly-onceをどのように処理しますか?
進捗と状態を保存するチェックポイントを使用するため、再起動されたクエリは停止した場所から続行されます。再生可能なソースと、Deltaのような冪等またはトランザクショナルなシンクを組み合わせることで、エンドツーエンドのexactly-onceの結果が得られます。
22. パイプラインを安全に再実行できるようにするにはどうしますか?
書き込みを冪等にします。キーに対する MERGE を使用する、特定のパーティションを上書きする、または実行IDを使用して重複を避けます。ジョブの入力範囲を明示的に保ち、行数をログに記録して結果を確認できるようにします。
23. データ品質チェックはどのように行いますか?
パイプラインで期待値や制約を使用し(例えばDeltaの制約や宣言型パイプラインの期待値)、行数、null、一意性を検証し、下流ユーザーとの契約に応じて、ロード全体を失敗させるのではなく不正な行を隔離します。
シナリオ
24. 20分で実行されていたジョブが今では3時間かかります。どうしますか?
- 両方の実行のSpark UIを比較する:どのステージが遅くなったか?
- 入力サイズと、テーブルが大きくなったかレイアウトを失ったか(例えば多数の小さなファイル)を確認する。
- 遅いステージでスキューやディスクへのスピルがないか探す。
- ワーカーの減少やインスタンスタイプの変更など、クラスタの変更を確認する。
- コードやSpark設定の変更、新しいjoinやUDFがないか確認する。
- 原因を修正し(コンパクション、ブロードキャスト、スキュー処理、またはサイジング)、モニタリングを追加する。
25. 毎日のJSONファイルを取り込み、ダッシュボードに提供するパイプラインを設計してください。
「Auto Loaderが新しいファイルを生データとメタデータを含むブロンズDeltaテーブルに読み込みます。ジョブがそれらを解析してシルバーにクレンジングし、MERGEでキーごとに重複排除します。ゴールドテーブルがダッシュボード用に集計し、ダッシュボードはSQLウェアハウスから読み取ります。Unity Catalogがアクセスを管理し、期待値が不正なデータを捕捉し、ジョブはジョブクラスタ上で実行され、失敗時および行数の異常時にアラートが発せられます。」
準備の進め方
ファイルを読み込み、別のテーブルと結合し、Deltaに書き込み、MERGEを使うノートブックを一通り実行しましょう。Spark UIを開いて、シャッフルとタスクの偏り(スキュー)を見つけます。パイプラインを高速化または修正した経験を、数値付きで1つ話せるように準備してください。関連トピックについては、Kafka、Snowflake、Talendのガイドをご覧ください。
回答は声に出して練習しましょう。特にパフォーマンス系の質問では、候補者が診断をせずにチューニングのコツを並べがちです。模擬面接の記録を見れば、どこでつまずくかが分かります。本番の面接では、AIツールに関する企業のルールに従ってください。
YesToTheOfferでDatabricks面接の回答を練習しましょう
模擬技術面接を実行し、パイプライン設計を声に出して説明し、後で文字起こしを確認します。30分無料、サブスクリプションなし。



