Databricks Certified Data Engineer Professional 無料問題 1 / 10 ・ 分野1: Developing Code for Data Processing using Python and SQL
宣言型自動化バンドル(Declarative Automation Bundles)のプロジェクトに、YAML で定義したジョブと Python で定義したジョブが混在している。デプロイのときに、失敗通知(email_notifications)をまだ持たないジョブにだけ、実行ユーザーあての失敗通知を足したい。既に通知を持つジョブは変えない。どう組むか。
- databricks.yml の variables に通知先を定義し、${var.通知先} を参照していないジョブにも、デプロイのときに既定値として入るようにする
- @job_mutator を付け、通知が無いジョブにだけ通知を足す関数を mutators.py に書き、resources/ の __init__.py で import すれば、デプロイ時に自動で呼ばれる
- @job_mutator を付けた関数で、通知があればそのまま、無ければ通知を足したコピーを返し、その関数を databricks.yml の python の mutators に並べる
- load_resources 関数の中で、読み込んだジョブに通知を足して返す。YAML のジョブも load_resources に渡されるので、両方に効く
正解と解説を見る
正解: C
正解の理由
Python サポートのミューテーター(mutator)は、YAML と Python のどちらで定義したリソースも、デプロイの途中で書き換えられる。@job_mutator を付けた関数はバンドルの全ジョブに1つずつ呼ばれ、書き換えたコピーか、受け取ったままのジョブを返す。通知を既に持つジョブはそのまま返し、無いジョブには dataclasses の replace で通知を足したコピーを返せば、要件のとおりになる。ミューテーターは databricks.yml の python セクションの mutators に書いた順に実行される。リソースの読み込み(load_resources)とは独立に使える。
違う選択肢
「@job_mutator を付け、通知が無いジョブにだけ通知を足す関数を mutators.py に書き、resources/ の __init__.py で import すれば、デプロイ時に自動で呼ばれる」… ミューテーターの関数は、databricks.yml の mutators に名前を書いたものだけが呼ばれる。ファイルを置いて import しただけでは実行されず、デプロイしても通知は1件も足されない。
「load_resources 関数の中で、読み込んだジョブに通知を足して返す。YAML のジョブも load_resources に渡されるので、両方に効く」… load_resources は Python で書いたリソースを読み込む入口で、既定の実装は resources パッケージの Python ファイルを読む。YAML で定義したジョブを受け取って書き換える仕組みではないので、YAML 側のジョブに通知が付かないまま残る。
「databricks.yml の variables に通知先を定義し、${var.通知先} を参照していないジョブにも、デプロイのときに既定値として入るようにする」… カスタム変数は、${var.名前} と書いた箇所にデプロイ時の値を埋めるだけである。参照していないジョブの設定に既定値として入り込むことはないので、通知の無いジョブは通知の無いままデプロイされる。
押さえどころ
ミューテーターの中で例外が起きると、バンドルのデプロイそのものが中断する。全ジョブに一律で効く書き換え(既定のジョブクラスターや SQL ウェアハウスの指定など)にも同じ仕組みが使える。ターゲットごとの切り替え(本番だけスケジュールを有効にするなど)は、デプロイモードとプリセットの側で行う。
Databricks Certified Data Engineer Professionalの演習アプリ(無料10問・全問は解錠で)へ