Azure Synapse Analytics (Data Factory): セルフホステッド統合ランタイムでプライベートネットワーク内のデータを抽出する


# はじめに
Azure Synapse Analytics、もしくは Data Factory でオンプレミスや Azure 仮想ネットワーク (VNet) 内のデータソースにアクセスする場合に必要なセルフホステッド統合ランタイム (セルフホステッド IR) の構成方法の説明となります。

検証には、Synapse Analytics を使用していますが、Data Factory の場合もほぼ同じ手順となります。

# 実装内容
プライベートネットワーク上にある DB サーバからデータを抽出し、Azure Data Lake Storage Gen2 (ADLS Gen2) に Parquet 形式で書き出す想定での実装を行います。
検証環境では、以下の構成図の通り、セルフホステッド IR の稼働ホストとして Azure 仮想マシン (VM) を使用し、オンプレミスと閉域接続している想定で別 VNet 上の MySQL サーバに仮想ネットワークピアリングで接続しています。
簡単に検証をするのであれば、セルフホステッドIRと同一の VNet 内に適当な RDB の VM を作成すれば問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/b6d64ffe-4b2c-5cf1-52c7-634d122a978c.png)
なお、本記事はセルフホステッド IR の構成、設定がメインとなるため、Synapse Analytics、ADLS Gen 2といった、セルフホステッド IR 以外のリソースがすべて作成済みであることを前提とします。
セルフホステッド IR 用 VM、およびネットワークについては以下の条件にて作成したものを使用します。

## ネットワーク
以下内容で作成した VNet、Subnetを使用しています。

| 項目 | 設定値 |  
| :-- | :-- |  
| VNet | 192.168.8.0/22 |  
| Subnet | 192.168.8.0/26 |  

Subnet には以下の Network Security Group (NSG) を適用しています。
セルフホステッド IR の詳細なネットワーク要件は、[こちら](https://docs.microsoft.com/ja-jp/azure/data-factory/create-self-hosted-integration-runtime?tabs=data-factory#ports-and-firewalls) を確認してください。

- Inbound Security Rules  

| Priority | Name | Port | Protocol | Source | Destination | Action |  
| :-- | :-- | :-- | :-- | :-- | :-- | :-- |  
| 100 | Allow_RDP | 3389 | TCP | {My IP} | Any | Allow |  
| *65000* | *AllowVnetInBound* | Any | Any | VirtualNetwork | VirtualNetwork | Allow |  
| *65001* | *AllowAzureLoadBalancerInBound* | Any | Any | AzureLoadBalancer | Any | Allow |  
| *65500* | *DenyAllInBound* | Any | Any | Any | Any | Deny |  

- Outbound Security Rules  

| Priority | Name | Port | Protocol | Source | Destination | Action |  
| :-- | :-- | :-- | :-- | :-- | :-- | :-- |  
| *65000* | *AllowVnetOutBound* | Any | Any | VirtualNetwork | VirtualNetwork | Allow |  
| *65001* | *AllowInternetOutBound* | Any | Any | Any | Internet | Allow |  
| *65500* | *DenyAllOutBound* | Any | Any | Any | Any | Deny |  

## Azure VM
セルフホステッド IR の最小要件を満たす構成にてVMを作成しています。
以下の要件以外は作成環境に応じて適宜変更してください。

<table>
    <thead>
        <th>項目</th><th>設定値</th><th>インストール要件</th>
    </thead>
    <tbody>
        <tr>
            <td>イメージ</td>
            <td> Windows Server 2019 Datacenter - Gen1</td>
            <td>
                以下のうちいずれかのOS
                  <ul>
                    <li>Windows 8.1</li>
                    <li>Windows 10</li>
                    <li>Windows Server 2012</li>
                    <li>Windows Server 2012 R2</li>
                    <li>Windows Server 2016</li>
                    <li>Windows Server 2019</li>
                </ul>
            </td>
        </tr>
        <td>サイズ</td><td> Standard F4s v2 (4 vcpu, 8 GiB RAM)</td><td>4 Core 2 GHz CPU, 8 GB RAM 以上</td>
    </tbody>
</table>


# セルフホステッド IR の登録
はじめに、Synapse Studio にセルフホステッド IR を登録し、統合ランタイムをホストマシンにインストールするための情報を生成します。

Synapse Studio を開き、ページ左の「管理」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/9c69e66c-8f32-d040-688d-677845c180f0.png)
メニューから「統合ランタイム」を選択し、「+新規」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/06ef9ab6-dd2e-aaa7-dbe7-24eb7c42938c.png)
「統合ランタイムのセットアップ」のランチャーで「セルフホステッド」を選択して「続行」をクリックし、「名前」に統合ランタイム環境を識別する一意の名前を入力し、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/aacbe2a2-d24c-13d8-7870-e8c31abe7f91.png)
作成後に表示される「オプション 2: 手動セットアップ」に従い、「統合ランタイムのダウンロードとインストール」のリンク先から統合ランタイムインストーラをローカルPCにダウンロードし、「認証キー」のいずれかをコピーして控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/3ce41a42-d4fb-5b75-5811-183b786a8122.png)

# 統合ランタイムのインストール
統合ランタイムをインストールする Azure VM に RDP でログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/0ae2193f-8dcc-9d25-96f7-88c7b6a26d4b.png)
ローカルPCにダウンロードしておいた統合ランタイムインストーラを RDP 経由でリモートサーバに配置します。
ローカルPC上のファイルをコピーし、リモートサーバのデスクトップに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/49d7e68a-9733-94bd-f938-86dfd93cf6a2.png)
インストーラを起動して、統合ランタイムのインストールを進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/4b1c5efe-e64c-02c1-1b48-e6baa85bafd4.png)
インストールが完了すると、以下のようなウィンドウが開きます。
テキストボックスに Synapse Studio のセルホステッドIR 登録時に控えておいた認証キーを入力し、登録をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/c96c7644-e9d3-0416-8e14-676de37c004a.png)
「Integration Runtime (Self-hosted) ノード名」を任意の名称に変更し、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/798e2439-fb38-c930-10a6-9a6d053e0ced.png)

正常に登録されたら、「構成マネージャーの起動」をクリックして完了させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/7792e4d4-d73a-773e-a126-27f00f3cd35a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/96b8a3d2-0513-66d0-e9c5-770c046a5e49.png)

Synapse Studioの「統合ランタイム」で登録したセルフホステッドIRを開き、「ノード」タブをクリックすると登録されたセルフホステッド IR ノードを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/c39d2135-a42e-e508-36f6-89a460831541.png)


# Java Runtime のインストール
セルフホステッド IR で Parquet 等の特定形式のデータを扱う場合は、ホストマシンに Java Runtime をインストールしておく必要があります。
Java Runtime としては、JRE、もしくは OpenJDK を使用することができますが、ここでは OpenJDK を使用します。

OpenJDK を使用する場合は、任意のビルドの「OpenJDK 8」と「Microsoft Visual C++ 2010 再頒布可能パッケージ」をホストマシンにインストールします。
使用したものは以下の通りです。

- Adoptium OpenJDK 8 (Windows x64)
    - https://adoptium.net/?variant=openjdk8
- Microsoft Visual C++ 2010 再頒布可能パッケージ
    - https://www.microsoft.com/download/details.aspx?id=26999

統合ランタイムインストーラと同様にそれぞれのインストーラをリモートサーバに配置し、デフォルト設定のままインストールを進めます。
インストールが終わったら、OpenJDK インストール先フォルダ内の jre フォルダパスをシステム環境変数「JAVA_HOME」として追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/a7a8c35b-d879-ccbf-57d2-2d14b2310c79.png)

# リンクサービスの登録
セルフホステッド IR で接続するプライベートネットワーク内の DB サーバをリンクサービスとして登録します。
ここでは MySQL サーバを使用しますが、接続先に応じて適宜設定内容を変更してください。
Synapse Studio の「管理」から「リンクサービス」を選択し、「+新規」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/4f5ac3d7-67ef-a1e5-6860-167fa6878067.png)
データストアの選択から「MySQL」を選択して「続行」をクリックし、フォームにDBの接続情報を入力します。
「統合ランタイム経由で接続」は作成したセルフホステッドIRを指定します。
入力が完了したら、「テスト接続」をクリックして接続できることを確認し、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/be2d5448-28e8-b9b5-0b28-558623e6ab83.png)

# セルフホステッドIRのテスト
セルフホステッドIRのテストとして MySQL サーバからデータを抽出し、Synapse Analytics の Primary ファイルシステムに Parquet ファイルとして出力します。
MySQL サーバには以下のようなテスト用テーブルを作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/f1b542cd-7f01-b92b-f6e2-52b1498bdf89.png)
まず、ソース、シンクとなるデータセットを登録します。
「データ」を開き、+ボタンから「統合データセット」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/02fa3a1e-7546-fc7b-76ba-9e354d8732bc.png)
データストアの選択から「MySQL」を選択し、登録した MySQL サーバのリンクサービスとデータを取得するテーブル名を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/bd998980-8ee7-a80c-4699-788e6b0fce24.png)
シンク先となる Parquet ファイルの書き出し用統合データセットも同様に作成します。
データストアの選択から「Azure Data Lake Storage Gen2」を選択し、形式の選択で「Parquet」を選択します。
リンクサービスとして Synapse Analytics 作成時にデフォルトで作成されているストレージを選択し、「ファイルパス」の「ファイルシステム」に Synapse Analytics の Primary ファイルシステム名、「ディレクトリ」、「ファイル」に任意のパスを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/b6c16a25-c80f-a85b-dacf-539b91a2d08b.png)
データを MySQL サーバから抽出し、Parquet ファイルとして出力するパイプラインのを作成します。
「統合」に移動し、+ボタンから「パイプライン」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/89f541b3-6250-6726-968e-cae5add2dce7.png)
キャンバスに「データのコピー」をドラッグ&ドロップして配置し、アクティビティの「ソース」、「シンク」に上記で作成した MySQL および Parquet の統合データセットを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/8c19a66c-5267-c79d-c9da-1d1de93a0d20.png)
「デバッグ」をクリックしてパイプラインのデバッグを開始し、アクティビティが成功することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/2c761e0e-332d-ce48-ca0a-ca2f3508e844.png)
デバッグに成功すると、Synapse Analytics の Primary ファイルシステムに Parquet ファイルが出力されます。
「データ」の「リンク済み」から Primary ファイルシステムを開くと出力された Parquet ファイルを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/2935da3c-1602-6a56-09cc-603b68622d38.png)
作成された Parquet ファイルを Notebook (PySpark) で確認すると DB の内容を取得できていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322093/dcdd5cf2-e9f6-5008-1202-c843a92caef6.png)


# 参考
- [セルフホステッド統合ランタイムを作成して構成する](https://docs.microsoft.com/ja-jp/azure/data-factory/create-self-hosted-integration-runtime)
- [Azure Data Factory および Azure Synapse Analytics での Parquet 形式](https://docs.microsoft.com/ja-jp/azure/data-factory/format-parquet#using-self-hosted-integration-runtime)