【備忘録】Azure DataFactoryを使ってgithubからAzure Data Lake Storage Gen2へデータコピーしてみる

忘れっぽい自分のためにメモとして残しておこうと思います。
##今回のケース
githubにアップロードしているCSVデータをData Lake Storage Gen2(以降、Gen2)にデータコピーします。

###データソース
今回使うのはCSVファイルです。
あらかじめ、Google検索結果の上位約100サイトの基本情報をCSVファイルに書き出しました。
このCSVファイルをgithubにアップロードしておきます。

データは下記のように格納されています。
![factory01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/bca1fe49-06e5-e118-e461-03ad810c23e2.png)

##Azure DataFactoryリソースの作成
[AzurePortal](https://azure.microsoft.com/ja-jp/features/azure-portal/)を起動後サインインします。
リソースの作成から、分析＞Data Factoryを選択して作成画面に遷移します。

![factory02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/624006ae-8e94-60fd-5d5c-d3c91c9295f4.png)

![factory03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/99b22216-44ff-f307-684f-c693875ab5e5.png)

下記のように入力して作成しました。
デプロイ完了するまでしばし待ちます。。。

- Name：任意
- Version：V2
- サブスクリプション：対象のもの
- Resource Group：対象のもの
- 場所：任意
- Enable Git：オフ
![fac04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/1a2093c8-fc9f-02df-f3f7-f7d8043256a7.png)

デプロイが完了したらリソースに移動して、データソースやパイプラインの作成を行います。

##流れに乗って一気に作成します
リソース画面に移動し、「Author & Moniter」を起動します。
![fac05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/99d1be39-2692-cacb-a14b-14a7f4741079.png)

外部データソースと接続するためのコネクション、データセット、パイプラインは個別に作成できますが、ここは一気に作成していきます。

###まずは、コピー元の接続を作成します
新しいウィンドうでDataFactory画面が起動したら、「Copy data」から作成します。
![fac06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/eb4c45e2-dde1-aee6-c6b1-012a4389aedc.png)


下記のように入力して次へ。

- Task name：任意
- Task description：任意
![fac07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/ff58bae8-576e-702b-6f5b-f4be87355474.png)

「Create new connection」から新しい接続を作成します。
![fac08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/95603360-83e4-ef6b-4db6-871f2e7102ea.png)

githubはオンライン上のGitであるため、通信プロトコルである「HTTP」を選択し次へ。
![fac09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/8ecaf6cf-1df5-41ed-5eba-5432b07c182f.png)

今回は下記のように入力しました。
サーバー証明書の検証はしない、認証タイプは匿名。
入力後は「Test connection」でテスト接続して確認します。

- Name：任意
- BaseURL：githubにアップロードしているURLを入力
- Server Certificate Validation：Disable
- Authentication type：Anonymous
![fac11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/73c31a3c-3353-e2d6-cfd8-50add7b17a12.png)

「File format settings」まで「次へ」で進めます。
ファイルフォーマットの設定を行います。
今回はCSVファイルなので、「Text format」を選択します。
画面下部でプレビューが確認できますので想定通りか確認してみてください。
![fac16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/b0722951-df1f-c3bd-63fb-156c38439f6e.png)

###続いて、コピー先の接続を作成します
先ほどと同じように「Cerate new connection」から作成します。
![fac12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/882a7ee7-53bd-310a-037c-6cc8972f4018.png)

今回はGen2へのコピーなので、「Azure Data Lake Storage Gen2」を選択します。
![fac13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/1bacd6d6-fd06-108e-aa31-fa7ba3c03619.png)

サブスクリプションやリソースグループ、コピー先のGen2ストレージアカウントを選択して作成します。テスト接続で確認もします。
![fac14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/2fa32df1-de71-a26b-4462-de0d62ffc923.png)

「Choose the input file or folder」画面まで「次へ」で進めます。
コピー先のコンテナがある場合はソレを指定、新たにコンテナ作成する場合はコンテナ名を入力します。
ここでは「otameshi」としました。
併せてファイル名も指定しました。
![fac15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/c157d599-ec35-e303-3363-c6fcb0d46c8a.png)

「File format settings」画面は同じCSVファイルであるため、既定値のまま次へ。
その他、コピーオプションがありますので、必要に応じて設定します。
今回は単純コピーなので既定値のまま進めています。

サマリーで確認します。
![fac17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/124fdd5e-76e4-7796-72f8-dc6b2b7a8670.png)

###デプロイと実行
次へ進むと、デプロイとパイプラインの実行が始まります。
正常に完了したら「Finish」押下で画面を閉じます。
![fac18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/da1e93f7-35ec-0a40-6932-731ef26796b4.png)

###確認する
正常に処理されたかどうかは、Monitorから確認できます。
作成したタスクのステータスが「Successed」になっているので正常に処理されているようです。
![fac19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/840fd15e-b3f1-76e3-65f0-7d6382469b88.png)



実際にGen2コンテナをのぞいてみます。
Gen2リソースを開き、「otameshi」コンテナにしっかり「copyafter.csv」ができています。
![fac20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/71edf8d3-cfe1-ea29-73b2-4edf5a82c11c.png)


##トリガーを作成して定期実行してみる
githubからGen2へコピーするタスクをスケジューリングして定期実行させてみようと思います。

###トリガーの作成
画面下部から「Trigger」を選択し、新しいトリガーを作成します。
![fac21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/1d494856-20c1-a3df-6421-265e2e5c11dd.png)


トリガー名、実行の詳細を設定します。
ここでは毎日、5分毎に実行というようにしました。
![fac22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/b4870a61-7d9f-0872-14d3-5c9320bf980e.png)

「Publish all」で更新します。
![fac23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/ff11f42b-a76b-6cc0-c595-021161d0b1c4.png)


###パイプラインにトリガーを関連付けていきます
作成したパイプラインを開き、「Trigger」タブ→「New/Edit」を選択して作成画面を開きます。
![fac24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/4703df11-79b4-739a-ae1a-65d9566ae34c.png)

先ほど作成したトリガーを選択してOKします。
「Publish all」で更新します。
![fac25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/adcf5864-7827-06ef-f2da-612f2f3f2403.png)


作成しただけでは停止しているので、トリガーを開始します。
開始後は忘れずに「Publish all」で更新します。
![fac26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/aa400149-5673-3001-5b73-f2a002c01643.png)
↓
![fac27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/7d2dcb9e-8701-bcad-511c-82c4f66d95f2.png)


###実際にスケジュールどおり実行されているか確認します
Gen2コンテナを覗いて確認します。
トリガー実行前の更新時間は「2020/6/15 14:22:07」です。
![fac26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/665eb474-5094-c5cd-a232-8849f706d1ba.png)

5分後の「2020/6/15 14:27:07」。
![fac30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/2c0c5fea-a237-f8de-42a0-9949b20a1241.png)

Monitorタブからパイプラインの実行状況も見てみます。
ちゃんと5分毎にトリガー実行されているようです。
めでたし、めでたし。
![fac29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521911/c57b7b5c-1a37-385c-14ab-70616d88dd8c.png)

##まとめ
今回はgithubのCSVファイルを、そのままGen2に持ってくるだけの至ってシンプルなケースです。
実際にデータソースはオンプレミスやクラウドやデバイスなど多数ある中で、情報をGen2など一箇所に集めたり、時にはフォーマット変換したりマージしたりとニーズも多種多様です。
まだまだ知らないことが沢山あるので引き続き知識の底上げをしていきたいと思います。