対象読者
- チームでDatabricksを利用している方
- 既存のJobで細かい条件に一致するものの洗い出しを行いたい方
目的
Jobがたくさんあるが、その中でも現在定期実行されているものを確認する。
(応用すれば他の情報でも抽出可能とおもわれます。)
流れ
- Databricks CLIを用いてJob一覧とそれらに紐づく情報をjsonで出力し、
- jupyter notebookで読み込み、
- 確認したい情報を抽出しcsvで出力します。
環境
- Mac
- Databricks on AWS
- python
- jupyter notebook
事前準備
- Databricks CLIが利用可能なように準備をしてください。
- jupyter notebookが利用可能なように準備をしてください。
コード
Job一覧取得
Databricks CLIが利用可能となったターミナルの、作業したいdirectoryで実行してください。
$ databricks jobs list --output JSON > job_list.json
何もつけない状態だとJob_idとJob_nameのみが出力されます。
--output JSON
というオプションをつけることで詳細な情報まで出力されます(JSON形式)。
欲しい情報のみ取得
以下はjupyter notebookで実行します。
import json
from pandas.io.json import json_normalize
json_open = open('./job_list.json', 'r')
json_load = json.load(json_open)
df_json = json_normalize(data=json_load, record_path='jobs')
jsonを読み込んでdataflameに変換しました。
列数が多いため、欲しい情報の含まれてそうな列のみを抽出します。
例えば定期実行スケジュールの情報が欲しい場合は'schedule'という文字列を含む列名を取得します。
temp_col = [item for item in df_json.columns if item.find('schedule') != -1]
temp_col
この結果
['settings.schedule.quartz_cron_expression',
'settings.schedule.timezone_id',
'settings.schedule.pause_status']
とでました。
これに、
'job_id'列と
設定されたnotebookである'settings.notebook_task.notebook_path'列
を加えて抽出します。
df_results = df_json[['job_id',
'settings.name',
'settings.schedule.quartz_cron_expression',
'settings.schedule.pause_status',
'settings.notebook_task.notebook_path',
]]
df_results
とすると、欲しい情報を持つ列のみに絞られたJOB一覧が出ました!
イメージ
job_id | settings.name | settings.schedule.quartz_cron_expression | settings.schedule.pause_status | settings.notebook_task.notebook_path |
---|---|---|---|---|
1 | AAA | NaN | NaN | /path/to/your/notebook/AAA |
2 | BBB | 0 0 12 * * ? | UNPAUSED | /path/to/your/notebook/BBB |
3 | CCC | 0 15 10 ? * * | PAUSED | /path/to/your/notebook/CCC |
settings.schedule.quartz_cron_expressionはcronの記法で書かれているとおもわれますので、読み解きが必要な場合は、
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
などを参考にしてください。
欲しい条件でfilter
「現在も定期実行され続けているもの」が今回出したい条件となります。
「settings.schedule.pause_status が'UNPAUSED'のもの」が条件に該当するとおもわれます。
前項で出した一覧を
df_results.to_csv('./job_list.csv')
で出力して、Googleスプレッドシートやエクセルにしてからfilterするのもありと思いますし、
df_filtered = df_results[df_results['settings.schedule.pause_status'] == 'UNPAUSED']
df_filtered.to_csv('./job_list.csv')
でfilterしたものを出力するのもありと思います。
感想
もしかするとこの記事を皆様が読まれているころにはDatabricks側で条件を指定したJob一覧の抽出が可能な機能が存在しているかもしれないですが、私がこの作業が必要となり、調べたときには見つからなかったため、調べながら実施したことを記事とします。
参考資料
- Databricks CLIのマニュアル
- jsonの読み込み
- jsonのdf化
- 特定の文字を含む列の名称を取得
- cronの記法