クラウドデータ連携を簡単かつ安全に！Azure Data Factoryのメタデータ駆動コピータスクで効率的なデータ連携

## 概要

多様な環境から多数のデータをクラウド環境へ連携する際に、 Azure Data Factory メタデータ駆動コピータスク機能がとても便利です。データ連携ツールがレコード量に対する課金であることから、コストの観点でデータ統合の推進のボトルネックとなることあるようです。そこで、Azure Data Factory のメタデータ駆動のコピータスクを利用することで、コストパフォーマンスに優れたサービスであり、短期間でデータ統合が可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f7d92fa1-15ff-70b8-0868-e623615aa1a0.png)

Azure 上でデータ分析基盤を構築する際には、 Azure Data Factory にてデータインジェストやパイプラインの実行管理を行うためによく利用されています。他クラウドでデータ分析基盤を構築している方であっても、圧倒的にコストパフォーマンスに優れていることから Azure Data Factory の導入を検討することをおすすめします。

私は本機能を用いて Databricks までの連携を自動化しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bd984d0c-7a89-67aa-b163-e15dd92def67.png)

## Azure Data Factory について

### Azure Data Factory のメリット

Azure Data Factory には、他社製品と比較すると下記のようなメリットがあります。

1. コストパフォーマンスに優れていること
1. 90 以上のコネクターを利用できること
1. オンプレミス環境など異なるネットワークから安全に連携できること

### コストパフォーマンスに優れている

Azure のドキュメントにて S3 から Azure Storage に 1 日 8 時間のデータ移動を実施した際の価格例が紹介されおり、 1 ヶ月当たり $122.00 （1ドル 161.13 円で換算すると約 19,657.68 円）とあります。Azure Data Factory は固定の費用もかからず、コネクターにより費用の変動もないため実際のこのような価格感で利用できます。データ連携ツールによっては、最低 10 万円からの契約であったり利用するコネクターによってはより高額なプランを契約しなくてはいけないことなどがあり、レコード量に応じて高額になることがあります。そういったデータ連携ツールと比較すると圧倒的なコストパフォーマンスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5d51a385-ab5e-6fb1-eb50-74a9f4f97738.png)

引用元：[価格の例: AWS S3 から Azure Blob Storage に 1 時間ごとにデータをコピーする - Azure Data Factory | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/pricing-examples-s3-to-blob)

### 90 以上のコネクターを利用できること

Azure Data Factory では 90 以上のコネクターを利用できます。一般的に利用されている製品のコネクターはサポートされており、 ODBC や REST API を利用できることが多くのソースからデータ取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8bcbb3b4-fed4-f230-b86d-88eea13166f0.png)


ただし、サポートされている製品が海外でも利用されている製品が多いため、 日本でよく利用されている印象のある Yahoo! 広告や LINE 広告などのマーケティング分野のコネクターは TOROCCO のようにはありません。利用するコネクターがサポート状況の確認は必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c8148435-5288-ae5a-46e0-b9b9404ccc71.png)

### オンプレミス環境など異なるネットワークから安全に連携できること

エージェントを任意のサーバーにインストールしてデータ連携をできるため、オンプレミス環境などか異なるネットワーク上にあるデータを安全に連携できます。SaaS 型データ連携ツールの場合にはマルチテナント型であることが多いから、そのネットワークにデータソースを解放する必要がありネットワークポリシーを満たせない場合があります。異なるネットワークから連携が容易になるだけでなく、アウトバウンド時の IP アドレスを固定化できることからデータソースのシステムにて IP 制限を設定した上でデータ連携ができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f09db7f6-d398-2210-b878-6243ddc85c69.png)

引用元：[自己ホスト型統合ランタイムを作成する - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/create-self-hosted-integration-runtime?tabs=data-factory)

## Azure Data Factory メタデータ駆動コピータスクとは

システムからクリックのみでデータ連携を行うパイプラインを作成できる機能です。同一のデータベースから数百のテーブルが連携する場合でも、同一のパイプラインで動作します。メタデータを保持する管理テーブルにおけるテーブル定義と INSERT 文、及び、３つのパイプラインが作成されます。Azure Data Factory の標準機能であるアクティビティを組み合わせて作られているため、改修することも容易に実施できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0854aef2-29ad-a8c3-d788-fedd48b7f775.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0b766a1e-b695-5f0b-3d33-98e3303a6a8f.png)

引用元：[データのコピー ツールでメタデータ駆動型の方法を使用して大規模なデータ コピー パイプラインを作成する - Azure Data Factory | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/copy-data-tool-metadata-driven#create-metadata-driven-copy-jobs-from-copy-data-tool)

作成される管理テーブルは下記の２つです。Main Control Table では、json 形式の文字列が保持されるため、json の文字列を外部で生成してテーブルに挿入することも可能です。

| #    | テーブル                 | 概要                                                         |
| ---- | ------------------------ | ------------------------------------------------------------ |
| 1    | Main Control Table       | コピーするデータオブジェクトのリストや、それぞれのコピー動作に関する情報が格納されます |
| 2    | Connection Control Table | データストアの接続情報が格納されます。パラメータ化されたリンクドサービスを使用する場合、このテーブルに接続値が保存されます。 |

作成されるパイプラインは下記の３つであ。MetadataDrivenCopyTask_xxx_BottomLevel にて指定した並列数でコピーアクティビティが動作します。

| #    | パイプライン名                         | 概要                                                         |
| ---- | -------------------------------------- | ------------------------------------------------------------ |
| 1    | MetadataDrivenCopyTask_xxx_TopLevel    | このパイプラインは、コピーするオブジェクト（テーブルなど）の総数を計算し、最大同時コピータスク数に基づいてシーケンシャルバッチの数を決定します。その後、異なるバッチを順次コピーするために MiddleLevel のパイプラインを実行します。 |
| 2    | MetadataDrivenCopyTask_xxx_MiddleLevel | このパイプラインは、各バッチ内のオブジェクトを取得し、コピータスクを実行するための準備を行います。具体的には、各グループごとにコピーするオブジェクトを取得し、 BottomLevel のパイプラインに渡します。 |
| 3    | MetadataDrivenCopyTask_xxx_BottomLevel | このパイプラインは、実際のデータコピーを実行します。各オブジェクトのコピーを行い、必要に応じてウォーターマークの更新や差分コピーの処理を行います。 |

## Azure Data Factory メタデータ駆動コピータスクのテクニック集

### テクニック一覧

Azure Data Factory メタデータ駆動コピータスクを利用する際のテクニックとして下記表に示すテクニックがあります。

| #    | 分類                     | テクニック                                 |
| ---- | ------------------------ | ---------------------------------------- |
| 1    | 開発支援                 | json ファイルの生成を Python 環境で生成  |
| 2    | パイプラインの改善       | 抽出期間を調整                           |
| 3    | パイプラインの改善       | 再試行のロジックを追加                   |
| 4    | パイプラインの改善       | SELECT 分による参照に変更                |
| 5    | パイプラインの改善       | 失敗したパイプラインのリトライ機構の追加 |
| 6    | パイプラインの改善       | 接続情報の切り替え                       |
| 7    | パイプラインの改善       | パイプラインの共通化                     |
| 8    | パイプラインの改善       | watermarkColumnStartValue を単独の列として保持                     |
| 9    | パイプラインの改善       | 差分連携時のファイル名を適切に設定                     |
| 10    | レイクハウス対応 | データ挿入日をディレクトリに保持        |
| 11   | レイクハウス対応 | Databricks への取り込み処理を追加        |

###  開発支援
#### json ファイルの生成を Python 環境で生成

Azure Data Factory のメタデータ駆動のコピータスクにてメタデータを Python （Databricks）環境で生成する方法を下記記事にて紹介しています。

- [Azure Data Factory のメタデータ駆動のコピータスクにてメタデータを Python （Databricks）環境で生成する方法 #AzureDataFactory - Qiita](https://qiita.com/manabian/items/5135a82f0783f6918c82)

### パイプラインの改善
#### 抽出期間を調整

Azure Data Factory のメタデータ駆動のコピータスクにて差分読み込み（DeltaLoad）を透かし列（watermarkColumn、基準値列ともいう）を Datetime で実施する場合に抽出期間を長くする方法を下記記事で紹介しています。

- [Azure Data Factory のメタデータ駆動のコピータスクにて透かし列（`watermarkColumn`）が Datetime の場合に抽出期間を長くする方法 #SQL - Qiita](https://qiita.com/manabian/items/09b6019ea1a0cc941c16)

#### 再試行のロジックを追加

設定すべき個別のアクティビティの再試行の設定を行う手順を下記記事で紹介しています。

- [Azure Data Factory のメタデータ駆動のコピータスクの個別のアクティビティにて再試行の設定を実施する方法 #AzureDataFactory - Qiita](https://qiita.com/manabian/items/28f43d25a94eaea3c57d)


#### SELECT 分による参照に変更

Azure Data Factory のメタデータ駆動のコピータスクにて差分読み込み（DeltaLoad）時にCopySourceSettings列のsqlReaderQueryの値を利用する方法を下記記事で紹介しています。

- [Azure Data Factory のメタデータ駆動のコピータスクにて差分読み込み（`DeltaLoad`）時に`CopySourceSettings`列の`sqlReaderQuery`の値を利用する方法 #AzureDataFactory - Qiita](https://qiita.com/manabian/items/f9cddf4117fe2c858720)

#### 失敗したパイプラインのリトライ機構の追加

Azure Data Factory のメタデータ駆動のコピータスクにて実行に失敗したコピーアクティビティのみ実行する方法を下記記事で紹介しています。

- [Azure Data Factory のメタデータ駆動のコピータスクにて実行に失敗したコピーアクティビティのみ実行する方法 #データエンジニアリング - Qiita](https://qiita.com/manabian/items/20f6530ca690e777504b)


#### 接続情報の切り替え

Azure Data Factory のメタデータ駆動のコピータスクにてデプロイメント環境（開発や本番などの環境）に応じて接続情報を切り替える方法を下記記事で紹介しています。

- [Azure Data Factory のメタデータ駆動のコピータスクにてデプロイメント環境に応じて接続情報を切り替える方法 #データエンジニアリング - Qiita](https://qiita.com/manabian/items/2a886558ab78be363750)

#### パイプラインの共通化

Azure Data Factory のメタデータ駆動のコピータスクにて利用するパイプラインをデータセットごとに共通化する方法を下記記事で紹介しています。

- [Azure Data Factory のメタデータ駆動のコピータスクにて利用するパイプラインをデータセットごとに共通化する方法 #ETL - Qiita](https://qiita.com/manabian/items/5a881cd58185a4c7386a)

### watermarkColumnStartValue を単独の列として保持

Azure Data Factory のメタデータ駆動のコピータスクにて、DataLoadingBehaviorSettings 列の json 内に保持されている watermarkColumnStartValue を watermarkColumnStartValue 列を単独の列として保持する方法を下記記事で紹介しています。メイン制御テーブルを Azure SQL Database 以外のデータベースで動作させたい場合などに UPDATE 文をシンプルにすることができます。

- [Azure Data Factory のメタデータ駆動のコピータスクにて`watermarkColumnStartValue`列を単独の列として保持する方法 #AzureDataFactory - Qiita](https://qiita.com/manabian/items/d97e005ce19a1e80b5e7)

### 差分連携時のファイル名を適切に設定

Azure Data Factory のメタデータ駆動のコピータスクにて差分連携時のファイル名を適切に実施する方法を下記記事で紹介しています

- [Azure Data Factory のメタデータ駆動のコピータスクにて差分連携時のファイル名を適切に実施する方法 #AzureDataFactory - Qiita](https://qiita.com/manabian/items/97b22278f48d5f98e419)

### レイクハウス対応

#### データ挿入日をディレクトリに保持

Azure Data Factory の メタデータ駆動のコピータスクにて Ingest Timestamp の Hive スタイルのパーティションの値（例：Ingest_timestamp=2024-06-05 02%3A46%3A50）を設定する方法を下記記事で紹介しています。

- [Azure Data Factory の メタデータ駆動のコピータスクにて Ingest Timestamp の Hive スタイルのパーティションの値を設定する方法 #データエンジニアリング - Qiita](https://qiita.com/manabian/items/713c45932e7fa0713679)


#### Databricks への取り込み処理を追加

Azure Data Factory メタデータ駆動のコピータスクにより ingest したファイルを Databricks で取り込む方法を下記記事で紹介しています。

- [Azure Data Factory メタデータ駆動のコピータスクにより ingest したファイルを Databricks で取り込む方法 #データエンジニアリング - Qiita](https://qiita.com/manabian/items/30c6dc6da1eb5dd5a84c)