Data Factoryを使ってBLOBからSynapse SQLプールへデータを入れてみた

Azure Data Factory（ADF）にデータのコピーツールがあります。これを利用することにより簡単かつ高速（Polybaseベース）にSynapse SQLプールにデータが投入できるようなので試してみました。
今回はAzure PortalからADFを使って、データ投入してみます。

#Azure Data Factoryの作成
①まずはAzure Data Factoryを作成します。
Azure Portalにログインし、`＋リソース作成`を選択します。
「新規」画面になりましたら、`分析`カテゴリを選択し、`すべて表示`を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/cce7cc7c-f3fe-c26e-2eaf-22cdd91b1551.png)|
|:--|

②Marketplace画面の`データインサイト`のカテゴリにあるData Factoryを選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/88dcbeec-ea1d-22bd-ea0b-597c5083906a.png)|
|:--|


③`作成`を選択してData Factoryの作成画面を起動します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/1dd18a9b-67b6-4066-fa15-a0bdd5ac517c.png)|
|:--|

④ADFを作成していきます。

* `サブスクリプション`、`リソースグループ`はADFが起動するサブスクリプションを指定してください。
*  `リージョン`は東日本を指定しました。
*  `Name`は任意の値を入れてください。またグローバルで一意となる名前の指定が必要です。
*  `Version`最新のV2を指定してください。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/2a513dc3-44e8-da55-ee36-a90079eff804.png)|
|:--|

⑤Gitの設定は今回は不要な為、`Configure Git later`のチェックボックスにチェックを入れます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/eaf69c84-a3c5-3ccb-41a9-4c4a81b3943f.png)|
|:--|

⑥作成を押せば作成が始まります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/b1850c20-af6d-b78d-3a70-81b420d51273.png)|
|:--|

⑦ADF作成が完了しました。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/7e8de2bc-2000-c9de-2ab2-90386fe1f3ee.png)|
|:--|

#パイプラインの作成
①Data Factoryが出来たらパイプラインの作成を行います。
作成した`Data Factory`のページから`Author & Monitor`を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/62dd3b0e-3f42-7efe-93de-ad86a125c220.png)|
|:--|

②`Let's get started`のページで「Copy data」を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/d009104e-32f1-9ac8-ab89-dcd4ace0b355.png)|
|:--|

③`Properties`ページでタスク名を入力します。今回は`CopyFromBlobToSynapseSQL`を入力しました。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/aaf6c1e3-045c-969b-5f7e-3bb7065dfe56.png)|
|:--|

④入力元のデータ（Source data store）を設定します。まだ何も作成していないので何も表示されていません。`+Create new connection`を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/806187de-ea0d-8301-2ac4-548eff74d14e.png)|
|:--|

⑤`New linked Service`で`Azure Data Lake Storage Gen2`を選択

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/b28bcff8-6739-a5c3-8fed-0fc182c1a572.png)|
|:--|

Blobへアクセスするための必要な情報を入力し、`Create`を押します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/b9809439-7a95-1b5c-b36d-edce8887fa6b.png)|
|:--|

⑥作成したリンクサービスを選択し、`Next`を押します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/0f4f4e83-3567-bb58-fc5c-ad702e0d3ccf.png)|
|:--|

⑦`Choose the input file or folder`では投入したいBlob上のファイルを選択します。今回は`tpch/sc1/lineitem.tbl`というファイルを選択しています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/76ccb9e1-fb6a-c8b5-36e0-6e24f6beb1b3.png)|
|:--|

⑧`File format settings`ではファイルに対する様々なフォーマットの指定が可能です。デリミタ(Column delimiter)や改行文字(Row delimiter)などを指定します。また、先頭行をヘッダーとして扱いたい場合、`First row as header`のチェックボックスにチェックを入れます。画面の下にはプレビューが見えています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/8ebb0dc2-cccf-db3c-e09f-74528893606b.png)|
|:--|

⑨次にデータを入れるSynapse SQLプールを指定します。まだ、接続情報などを入力していないので、`Create new connection`にて作成を行います。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f29c03f4-a95b-48ed-029f-a5d8efc99aee.png)|
|:--|

⑩Synapse SQLプールへ必要な接続情報を入れていきます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f4485719-1201-795e-466e-187c0122a43f.png)|
|:--|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/fc939586-b063-d6a7-98eb-68c427377702.png)|
|:--|

この時にSynapse SQLプールへの接続がうまくいかない場合にはSynapse SQLプール側の「ファイアウォールと仮想ネットワーク」の設定で「Azureおよびリソースにこのサーバーへのアクセスが許可する」が「はい」を設定されているか確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/b679c15f-8ea5-8a3a-aed5-0205a6f53d05.png)

⑪作成したリンクサービスを選択し`Next`を押します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/51688f23-5754-a3cc-5294-9b3801fbb726.png)|
|:--|

⑫データをロードするSynapse SQLプール上のテーブルを指定します。`dbo.LINEITEM`というテーブルを指定しています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/6fe5b84a-4d17-77a7-2ca4-1b26bfc77f5d.png)|
|:--|

⑬入力テーブルとテーブルのフォーマットよりADFが自動でマッピングを行ってくれます。問題無いかを確認し`Next`を押します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/23e0e925-76aa-9ebd-9340-a9624cde6e30.png)|
|:--|

⑭`Setting`の画面になりましたら、`Copy method`が`Polybase`であることを確認してください。また、Synapse SQLプールへPolybaseを行う場合、ステージングとして利用するBlobストレージが必要です。リンクサービスの作成は先ほどのBlobストレージのリンクサービスの作成の方法と同じなので割愛しますが、今回は`StagingLinkedService`という名前のリンクサービスを使用しています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f1ac1686-d40d-c230-92e3-ef5766d7aa81.png)|
|:--|

⑮確認画面です。`Next`を押します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/853fe25d-a67a-3121-8ef0-b9f3c9994c1c.png)|
|:--|

⑯パイプラインのデプロイが完了したら`Monitor`を押してパイプラインの走行状況を確認します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/3a16753c-df4d-834c-070d-bc60c596ad99.png)|
|:--|

#パイプラインの走行状況の確認
①`Monitor`→`Pipelines runs`から作成したパイプラインの確認が可能です。作成したパイプラインを押下します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/f87da8a3-c45f-c054-3362-0b7f4e5c5ef6.png)|
|:--|

②走行状況は`Activity runs`のメガネマーク（Detailes）を押下するとより詳細が確認出来ます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/15bf1049-8795-8f83-2f98-baf444c71980.png)|
|:--|

③読み込んだ件数やSynapse SQLプールへロードした件数などもここで確認することは可能です。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/d3a48ffe-5222-175f-3458-8ac99b4406c9.png)|
|:--|

④念の為Synapse SQLプールでもデータを確認しましたが、ちゃんと入っているようです。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/1a894e78-d443-5e4b-6a01-68f6025691aa.png)|
|:--|

#最後に
Synapse SQLプールにADFを使うと簡単にPolybaseでデータロードできるのかと思ったのですが、意外と手番が多かったです。