dbtを使用するAirflowワークフローをTeradata Vantageを使って実行してみる

著者 Igor Machin, Ambrose Inman
最終更新日 2022年11月18日

:::note warn
警告
本記事はTeradata Corporationのサイト[Getting Started](https://quickstarts.teradata.com/index.html#getting-access-to-vantage)に掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

## 概要

このチュートリアルではAWS EC2 VMにAirflowをインストールし、dbtを使用するようにワークフローを構成し、Teradata Vantageデータベースに対してそれを実行する方法を説明します。Airflowは、データを処理しロードするためのデータパイプラインを構築するために通常使用されるタスクスケジューリングツールです。この例ではDockerベースのAirflow環境を作成するAirflowのインストールプロセスを実行します。Airflowをインストールしたら、Teradata VantageデータベースにデータをロードするAirflow DAG（Direct Acyclic Graph、または単にワークフロー）の例をいくつか実行します。

## 前提条件

１．AWS（Amazon Web Services）にアクセスしVMを作成するための権限を持つこと

::: note info
ヒント
このチュートリアルは、このドキュメントで紹介したマシン（AWS上のt2.2xlarge EC2、ストレージは約100GB）と同等の計算能力とストレージを持ち、インターネットに接続されていれば、他の計算プラットフォームやベアメタルマシンでも調整することが可能です。もし、別の計算機プラットフォームを使用する場合は、チュートリアルのいくつかのステップを変更する必要があります。
:::

２．SSHクライアントが必要です

::: note info
ヒント
MacやLinuxマシンであれば、これらのツールはすでに含まれています。Windowsであれば、[PuTTY](https://www.putty.org/)や[MobaXterm](https://mobaxterm.mobatek.net/download.html)をご検討ください。
:::

３．Teradata Vantageインスタンスにアクセスする必要があります。Vantageをご利用でない場合は、開発者向けの無償版である[Teradata Vantageのお試し環境の構築方法（まとめ）](https://qiita.com/ykswi/items/ac06fe8b4fef48582e37)をご覧ください。


# Install and execute Airflow
## Create a VM
１．AWS EC2のコンソールにアクセスし、「インスタンスの起動」をクリックします。

２．OSイメージに「Red Hat」を選択します。

３．インスタンスタイプは「t2.2xlarge」を選択します。

４．新しいキーペアを作成するか、既存のキーペアを使用します。

５．ネットワーク設定を適用して、サーバーにsshでアクセスできるようにし、サーバーがインターネットにアウトバウンド接続できるようにします。通常、デフォルトの設定を適用します。

６．100GBのストレージを割り当てます。

## Pythonのインストール

１．ec2-userユーザでマシンにsshします。

２．pythonがインストールされているか確認します（Python3.7以上である必要があります）。コマンドラインから python または python3 と入力してください。

３．pythonがインストールされていない場合(コマンドが見つからないというメッセージが出る場合)は、以下のコマンドを実行してインストールします。コマンドは、yと入力してインストールを確認するよう要求する場合があります。

```:install.sh
sudo yum install python3
# create a virtual environment for the project
sudo yum install python3-pip
sudo pip3 install virtualenv
```

## エアフロー環境の構築

１．Airflowのディレクトリ構造を作成する（ec2-userのホームディレクトリ/home/ec2-userから）。

```:CreateDirectry.sh
mkdir airflow
cd airflow
mkdir -p ./dags ./logs ./plugins ./data ./config ./data
echo -e "AIRFLOW_UID=$(id -u)" > .env
```

２．お好みのファイル転送ツール（scp、PuTTY、MobaXtermなど）を使用して、airflow.cfgファイルをairflow/configディレクトリにアップロードしてください。

## Dockerのインストール

Dockerはコンテナ化ツールであり、Airflowをコンテナ環境にインストールすることができます。

::: note info
メモ
手順は、airflow ディレクトリで実行する必要があります。
:::

１．Podman (RHELのコンテナ化ツール)をアンインストールします。

```:UninstallPodman.sh
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
podman \
runc
```

２．yumユーティリティのインストール

```:InstallYumUtility.sh
sudo yum install -y yum-utils
```

３．yumリポジトリにdockerを追加します。

```:AddDockertoYumRepogitry.sh
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
```

４．dockerをインストールします。

```:InstallDocker.sh
sudo yum install docker-ce docker-ce-cli containerd.io
```

５．dockerをサービスとして起動します。最初のコマンドは、次回のシステム起動時に自動的にdockerサービスを実行します。2番目のコマンドは、今すぐDockerを起動します。

```:StartDocker.sh
sudo systemctl enable docker
sudo systemctl start docker
```

６．Dockerが正しくインストールされているかどうかを確認します。このコマンドは、コンテナの空のリストを返すはずです（まだどのコンテナも起動していないため）。

```:ConfirmDocker.sh
sudo docker ps
```

## docker-composeとdocker環境設定ファイルをインストールします。

１．[docker-compose.yaml](https://quickstarts.teradata.com/other-integrations/_attachments/execute-airflow-workflows-that-use-dbt-with-teradata-vantage/docker-compose.yaml)と[Dockerfile](https://quickstarts.teradata.com/other-integrations/_attachments/execute-airflow-workflows-that-use-dbt-with-teradata-vantage/Dockerfile)をVMにアップロードし、airflowディレクトリに保存してください。

::: note info
ヒント
docker-compose.yamlとDockerfileが行うこと
docker-compose.yamlとDockerfileは、インストール時に環境を構築するために必要なファイルです。docker-compose.yamlファイルは、Airflowのdockerコンテナをダウンロードし、インストールするものです。このコンテナには、Web UI、メタデータ用のPostgresデータベース、スケジューラ、3つのワーカー（3つのタスクを並行して実行可能）、トリガー、dbtが生成するドキュメントを表示するためのnginx Webサーバーが含まれています。このほか、コンテナへのホストディレクトリのマウントや、各種インストール処理も行われる。Dockerfileは、各コンテナに必要なパッケージを追加でインストールします。

docker-compose.yamlとDockerfileが何をするファイルなのか、もっと詳しく知りたい方はこれらのファイルをご覧ください。何がなぜインストールされるのかを明確にするためのコメントもあります。
:::

２．docker-composeをインストールします（yamlファイルを実行するのに必要です）。

::: note info
メモ
	この手順は、バージョン 1.29.2 に基づいています。最新のリリースは [https://github.com/docker/compose/releases](https://github.com/docker/compose/releases) で確認し、必要に応じて以下のコマンドを更新してください。
:::

```:InstallDockerCompose.sh
sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```

３．docker-composeのインストールをテストします。このコマンドは docker-compose のバージョンを返すはずです。例えば docker-compose version 1.29.2, build 5becea4c のようになります：

```:ConfirmCompose.sh
docker-compose --version
```

## Install a test dbt project

::: note info
メモ
dbtツール自体は、後でdocker-composeによってコンテナにインストールされます。
:::

１．gitをインストールします：

```:InstallGit.sh
sudo yum install git
```

２．ジャッフルショップのdbtプロジェクトのサンプルを入手する：

::: note info
メモ
dbtディレクトリは、ホームディレクトリの下に作成されます（airflowの下には作成されません）。この例では、ホームディレクトリは/home/ec2-userです。
:::

```:GetdbtProject.sh
# move to home dir
cd
mkdir dbt
cd dbt
git clone https://github.com/Teradata/jaffle_shop-dev.git jaffle_shop
cd jaffle_shop
mkdir target
chmod 777 target
echo '' > target/index.html
chmod o+w target/index.html
```

３．Teradata Studio Express、bteqなどのデータベースツールを使用して、Teradataデータベース上にairflowtestとjaffle_shopのユーザー/データベースを作成します。dbcとしてデータベースにログインし、コマンドを実行します（必要に応じてパスワードを変更します）：

```sql:CreateUserOnDB.sql
CREATE USER "airflowtest" FROM "dbc" AS PERM=5000000000 PASSWORD="abcd";
CREATE USER "jaffle_shop" FROM "dbc" AS PERM=5000000000 PASSWORD="abcd";
```

４．dbtの設定ディレクトリを作成します：

```:CreateDirectryFordbt.sh
cd
mkdir .dbt
```

５．[profiles.yml](https://quickstarts.teradata.com/other-integrations/_attachments/execute-airflow-workflows-that-use-dbt-with-teradata-vantage/profiles.yml)を.dbtディレクトリにコピーします。

６．Teradataデータベースの設定に対応するように、ファイルを編集します。最低でも、ホスト、ユーザー、パスワードは変更する必要があります。ステップ3で設定したjaffle_shopのユーザー認証情報を使用します。

## DockerでAirflow環境を作成する

１．Dockerfileとdocker-compose.yamlがあるairflowディレクトリで、Docker環境作成スクリプトを実行します：

```:aaa
cd ~/airflow
sudo docker-compose up --build
```

インストールが完了すると、画面に次のようなメッセージが表示されます：

```:MessageAfterInstall
airflow-webserver_1  | 127.0.0.1 - - [13/Sep/2022:00:20:48 +0000] "GET /health HTTP/1.1" 200 187 "-" "curl/7.74.0"
```

これは、Airflow Web サーバーが通話を受け入れる準備ができていることを意味します。

２．これで、Airflowが起動したはずです。インストール時に使用していたターミナルセッションは、ログメッセージの表示に使用されますので、以降の手順では別のターミナルセッションを開くことをお勧めします。Airflowのインストールの種類を確認する：

```:CinfirmInstall.sh
sudo docker ps
```

というような結果になるはずです：

|CONTAINER ID|IMAGE|COMMAND|CREATED|STATUS|PORTS|NAMES|
|:------------|:-----|:-------|:-------|:------|:-----|:-----|
|60d50d9f43f5|apache/airflow:2.2.4|"/usr/bin/dumb-init …"|18 minutes ago|Up 18 minutes (healthy)|8080/tcp| airflow_airflow-scheduler_1|
|e2b46ec98274|apache/airflow:2.2.4|"/usr/bin/dumb-init …"|18 minutes ago|Up 18 minutes (healthy)|8080/tcp|airflow_airflow-worker_3_1|
|7b44004c7277|apache/airflow:2.2.4|"/usr/bin/dumb-init …"|18 minutes ago|Up 18 minutes (healthy)|8080/tcp|airflow_airflow-worker_1_1|
|4017b8ce9235|apache/airflow:2.2.4|"/usr/bin/dumb-init …"|18 minutes ago|Up 18 minutes (healthy)|0.0.0.0:8080->8080/tcp, :::8080->8080/tcp|airflow_airflow-webserver_1|
|3cc407e2d565|apache/airflow:2.2.4|"/usr/bin/dumb-init …"|18 minutes ago|Up 18 minutes (healthy)|0.0.0.0:5555->5555/tcp, :::5555->5555/tcp, 8080/tcp|airflow_flower_1|
|340a83b202e3|apache/airflow:2.2.4|"/usr/bin/dumb-init …"|18 minutes ago|Up 18 minutes (healthy)|8080/tcp|airflow_airflow-triggerer_1|
|82198f0d8b84|apache/airflow:2.2.4|"/usr/bin/dumb-init …"|18 minutes ago|Up 18 minutes (healthy)|8080/tcp|airflow_airflow-worker_2_1|
|382c3077c1e5|redis:latest|"docker-entrypoint.s…"|18 minutes ago|Up 18 minutes (healthy)|6379/tcp|airflow_redis_1|
|8a3be8d8a7f4|nginx|"/docker-entrypoint.…"|18 minutes ago|Up 18 minutes (healthy)|0.0.0.0:4000->80/tcp, :::4000->80/tcp| airflow_nginx_1|
|9ca888e9e8df|postgres:13|"docker-entrypoint.s…"|18 minutes ago|Up 18 minutes (healthy)|5432/tcp|airflow_postgres_1|


３．オプション：Dockerのインストールを削除したい場合（例えば、docker-compose.yamlとDockerfileファイルを更新して別の環境を再作成する場合）、コマンドは（これらのファイルがあるairflowディレクトリから）です：

```EraseDocker.sh
sudo docker-compose down --volumes --rmi all
```

スタックが停止したら、設定ファイルを更新し、手順 1 のコマンドを実行して再起動します。

４．AirflowのWeb UIが動作するかどうかをテストするには、ブラウザで次のURLを入力します。<VM_IP_ADDRESS>をVMの外部IPアドレスに置き換えてください：

○ DAG UI: [http://<YOUR_IP_ADDRESS>:8080/home](http://%3Cyour_ip_address%3E:8080/home) - ユーザー名: airflow / パスワード: airflow

○ Flower Airflow UI (ワーカーコントロール): [http://<YOUR_IP_ADDRESS>:5555/](http://%3Cyour_ip_address%3E:5555/)



## エアフローDAGの実行

１．[airflow_dbt_integration.py](https://quickstarts.teradata.com/other-integrations/_attachments/execute-airflow-workflows-that-use-dbt-with-teradata-vantage/airflow_dbt_integration.py), [db_test_example_dag.py](https://quickstarts.teradata.com/other-integrations/_attachments/execute-airflow-workflows-that-use-dbt-with-teradata-vantage/db_test_example_dag.py), [discover_dag.py](https://quickstarts.teradata.com/other-integrations/_attachments/execute-airflow-workflows-that-use-dbt-with-teradata-vantage/discover_dag.py), [variables.json](https://quickstarts.teradata.com/other-integrations/_attachments/execute-airflow-workflows-that-use-dbt-with-teradata-vantage/variables.json) ファイルを /home/ec2-user/airflow/dags にコピーしてください。


２．ファイルを調べる：

○ db_test_example_dag.py - いくつかのテーブルを作成し、クエリを実行するシンプルなTeradataのSQLの例です。

○ airflow_dbt_integration.py - dbtのサンプル（dbtとairflowをTeradataデータベースと統合する）を実行します。この例では、架空のjaffle_shopデータモデルが作成、ロードされ、このプロジェクトのドキュメントが作成されます（ブラウザでhttp://"YOUR VM_IP_ADDRESS":4000/) を指定すると見ることができます）。

::: note warn
重要
db_test_example_dag.pyの調整
db_test_example_dag.pyを更新して、TeradataデータベースのIPアドレスがあなたのデータベースを指すようにする必要があります。
:::

○ discover_dag.py - 様々なタイプのデータファイル（CSV, Parquet, JSON）を読み込む方法の例です。ソースコードファイルには、プログラムが何を行い、どのようにそれを使用するかを説明するコメントが含まれています。このサンプルは、variables.json ファイルに依存しています。このファイルは、Airflowにインポートする必要があります。それは後続のステップで行われます。

３．これらのdagファイルがエアフローツールに拾われるまで数分待ちます。これらのファイルがピックアップされると、Airflow ホームページのダグリストに表示されます。

４．variables.json ファイルを変数ファイルとして Airflow にインポートします：

○ Admin → Variables メニュー項目をクリックし、Variables ページに移動します。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/7af97c89-fd9d-7d7d-fac9-588a60e39f32.png">

○ Choose Fileをクリックし、ファイルエクスプローラーでvariable.jsonを選択し、Import Variablesをクリックします。


<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/134b80d5-6039-b14f-946f-94880e90da6d.png">

○ お使いの環境に合わせて、変数を編集してください

５．UIからダグを実行し、ログを確認する。


# まとめ

このチュートリアルは、Linux サーバーに Airflow 環境をインストールする方法と、Airflow を使用して Teradata Vantage データベースと対話する方法について、実践的な演習を提供することを目的とし ています。また、Airflow とデータモデリングおよびメンテナンスツールである dbt を統合して、Teradata Vantage データベースを作成およびロードする方法についての例も提供されます。

# さらに詳しく

・[Teradata Vantageでdbt（データビルドツール）を使用する](https://quickstarts.teradata.com/dbt.html#_install_dbt)