Airflow の Metastore に SQL Server を使う

 
Airflow の Metastore をずっとデフォルトの SQLite のままにしてたけど MS SQL Server 2019 に変更したのでメモ。

まずは SQL Server の設定。
公式ドキュメントに書いてある手順を参考にする。

Set up a Database Backend — Airflow Documentation

CREATE DATABASE airflow;
ALTER DATABASE airflow SET READ_COMMITTED_SNAPSHOT ON;
CREATE LOGIN airflow_user WITH PASSWORD='airflow_pass123%';
USE airflow;
CREATE USER airflow_user FROM LOGIN airflow_user;
exec sp_addrolemember 'db_owner', 'airflow_user';

パスワードは適当に変える事。
あと公式だと最後の行は GRANT ALL PRIVILEGES を使ってるけど SSMS に「そんな構文ネーヨ」って怒られたので exec sp_addrolemember を使った。

続いて 関連ライブラリを入れる。
unixodbc-devmsodbcsql17 などが必要なので、前に書いた記事のとおりにそれらをインストールする。

Ubuntu 20.04: Azure SQL Server コマンドラインツールをインストール

あと他にも build-esseintial も必要なので入れておく。

$ sudo apt install build-esseintial

それから pyodbc を入れる。

$ pip install pyodbc

続いて airflow.cfg を修正。
sql_alchemy_conn の値を変える。

# airflow.cfg
# sql_alchemy_conn = sqlite:////home/orenomemo/airflow/airflow.db
sql_alchemy_conn = mssql+pyodbc://airflow_user:airflow_pass123%%@localhost:1433/airflow?driver=ODBC+Driver+17+for+SQL+Server

上記のパスワードのところで「 % 」が 2 つ並んでるのはエスケープで、1 個だけだと configparser.InterpolationSyntaxError: ‘%’ must be followed by ‘%’ or ‘(‘, というエラーが出る。

ついでに、デフォルトの SequentialExecutor だと並列処理が出来ない云々のメッセージが管理 UI に表示されるので LocalExecutor に変える。

# airflow.cfg
#executor = SequentialExecutor
executor = LocalExecutor

ここまで設定したら airflow を初期化。
Admin ユーザーも作る。

airflow db init
airflow users create \
    --username admin \
    --firstname hoge \
    --lastname fuga \
    --role Admin \
    --email hoge@example.com

そして Airflow を起動すれば OK.

 
おまけ)
PostgreSQL でやろうとしたら、公式ドキュメントには psycopg2 を使えと書いてあるんだがインストールでコケる。
しかし psycopg2 を使わなくても動く。

つまりこうすればOK.

CREATE DATABASE airflow_db;
CREATE USER airflow_user WITH PASSWORD 'airflow_123%';
GRANT ALL PRIVILEGES ON DATABASE airflow_db TO airflow_user;

設定はこうなる。

# airflow.cfg
sql_alchemy_conn = postgresql://airflow_user:airflow_123%%@localhost/airflow_db