SQL Server 2019 ビッグデータクラスターを AKS で使う - アプリケーションの展開

今回は [こちらの記事](https://qiita.com/kenakamu/items/fd7834f07e391b90337a) で構築した SQL Server 2019 BDC にアプリケーションを展開します。

# アプリケーション

SQL Server 2019 BDC では以下の種類のアプリケーションがサポートされます。

- R/Python 関数、モデル、およびアプリ
- MLeap Serving
- SSIS

アプリケーションはクラスター内に展開され、外部からも内部からも利用ができます。
![](https://github.com/microsoft/sql-server-samples/raw/master/samples/features/sql-big-data-cluster/app-deploy/Appdeploy.PNG)

アプリケーションは spec.yaml という仕様ファイルで展開を定義します。

## レプリカ数とプールサイズ

アプリケーションの並列処理をサポートできるよう、レプリカ数とプールサイズを指定します。

- レプリカ数: ポッドの数
- プールサイズ: 1 ポッドに含めるアプリケーションの数

以下の場合、1 レプリカあたり N 個のアプリケーションを含むポッドが N 個展開されるため、NxN の並列処理が可能です。
![](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/media/big-data-cluster-create-apps/poolsize-vs-replicas.png?view=sql-server-ver15)

# アプリケーションの展開: Python 関数

まずは一番シンプルな Python 関数を展開してみます。

1\. 任意のディレクトリで以下コマンドを実行。Visual Studio Code で開く。

```shell
azdata app init --name addpy --version v1 --template python
code addpy
```

2\. hello.py を add.py にリネームして、以下コードに差し替え。

```python:add.py
def add(x, y):
    result = x+y
    return result
result=add(x,y)
```

3\. spec.yaml の中身を以下に差し替え。

- name: アプリケーションの名前
- version: アプリケーションのバージョン
- runtime: 言語 (R または Python)
- src: アプリへのパス
- entrypoint: 呼び出される関数名
- replicas: レプリカ数
- poolsize: プールサイズ
- inputs: アプリで利用するインプットと型
- output: アウトプットと型
 
```yaml:spec.yaml
#spec.yaml
name: add-app
version: v1
runtime: Python
src: ./add.py
entrypoint: add
replicas: 1
poolsize: 1
inputs:
   x: int
   y: int
output:
   result: int
```

4\. azdata でアプリを展開。

```shell
>azdata login -n mssql-cluster 
Username: admin
Password:
>azdata app create --spec ./addpy
Application `add-app/v1` successfully created.
```

5\. 作成状況を確認。

```shell
>azdata app list
App                                                Name     State             Version
-------------------------------------------------  -------  ----------------  ---------
https://52.xxx.xxx.xxx:30080/api/v1/app/add-app/v1  add-app  WaitingForCreate  v1
```

6\. アプリケーション展開で作成されるポッドやサービスを確認。

```shell
>kubectl get pods
NAME              READY   STATUS    RESTARTS   AGE
app1-xcpv4        2/2     Running   0          17m
appproxy-225bf    2/2     Running   2          5h11m
compute-0-0       3/3     Running   3          5h11m
control-5fpdx     3/3     Running   3          5h26m
conaktroldb-0       2/2     Running   2          5h26m
...
>kubectl get svc app-add-app-v1 
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
app-add-app-v1   ClusterIP   10.0.19.82   <none>        8080/TCP   18m
>kubectl get replicasets app1 -n mssql-cluster
NAME   DESIRED   CURRENT   READY   AGE
app1   1         1         1       19m
```

7\. ポッドの詳細を確認。

- mlserver と fluentbit から構成
- アプリは APP_DOWNLOAD_URL から取得

```shell
>kubectl describe pod app1-xcpv4 -n mssql-cluster
Name:               app1-xcpv4
Namespace:          mssql-cluster
...
Controlled By: ReplicaSet/app1
Containers:
  mlserver:
    Image: mcr.microsoft.com/mssql/bdc/mssql-mlserver-py-runtime:2019-GDR1-ubuntu-16.04
...
    Environment:
...
      APP_DOWNLOAD_URL: https://nmnode-0-0.nmnode-0-svc:50470/webhdfs/v1/system/appdeploy/app-add-app-v1/app.zip?op=OPEN|
...
  fluentbit:
    Image: mcr.microsoft.com/mssql/bdc/mssql-monitor-fluentbit:2019-GDR1-ubuntu-16.04
...
    Requests:
      cpu:     100m
      memory:  100Mi
...
QoS Class: Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
...
```

8\. ADS から接続して展開されたアプリの zip を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/60a45c55-5b91-9649-28b5-b1c403314dcf.png)

9\. azdata で詳細を取得。

```shell
>azdata app describe --name add-app --version v1
{
  "input_param_defs": [
    {
      "name": "x",
      "type": "int"
    },
    {
      "name": "y",
      "type": "int"
    }
  ],
  "internal_name": "app1",
  "links": {
    "app": "https://52.xxx.xxx.xxx:30080/api/v1/app/add-app/v1",
    "swagger": "https://52.xxx.xxx.xxx:30080/api/v1/app/add-app/v1/swagger.json"
  },
  "name": "add-app",
  "output_param_defs": [
    {
      "name": "result",
      "type": "int"
    }
  ],
  "state": "Ready",
  "version": "v1"
}
```

# 展開したアプリケーションの利用

次に展開したアプリケーションを使ってみます。

## azdata から実行

動作しているかを確認するだけなら、 azdata を使う方法が簡単です。

```shell
>azdata app run --name add-app --version v1 --inputs x=1,y=2
{
  "changedFiles": [],
  "consoleOutput": "",
  "errorMessage": "",
  "outputFiles": {},
  "outputParameters": {
    "result": 3
  },
  "success": true
}
```
## Open API で利用

SQL Server 2019 BDC で公開されている Cluster Management Service でトークンの取得を行い、Application Proxy でアプリを実行できます。すべてのアプリケーションは run メソッドにパラメーターを引き渡して実行します。

1\. ブラウザで azdata app describe で取得した swagger エンドポイントのホスト名と IP アドレスを使って https://<host>:<post>/docs/swagger.json へアクセス。認証情報が聞かれるので、クラスタ構築で使ったアカウントを利用。
※証明書が聞かれた場合はキャンセルをすると認証を聞かれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ad7c2b86-380b-1bca-09d7-f4e7753453f1.png)

2\. 取得した json を [Swagger Editor](https://editor.swagger.io/) に張り付け。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c1770019-7a84-a039-3e09-397180e48577.png)

3\. token メソッドがあるので、Postman で token に Post 要求を実行。access_token を取得。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0732a186-f863-44ee-83c5-8ef834e2a873.png)

4\. 取得したアクセストークンを使って、https://<application proxy>:30778/api/app/add-app/v1/run を実行。本文に入力パラメーターを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/704c5ee0-a823-d7ff-dfb8-4fbc0756a4aa.png)

# Visual Studio Code (VSC) の利用

拡張機能を利用して VSC からも操作が可能です。

[参照: Visual Studio Code を使用して SQL Server ビッグ データ クラスターにアプリケーションを展開する方法](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/app-deployment-extension?view=sql-server-ver15)

## 拡張機能のインストール

1\. 「アプリ展開の拡張機能](https://aka.ms/app-deploy-vscode) より最新の拡張をダウンロード。

2\. VSC の 拡張機能より 「...」 をクリックして、「VSIX からのインストール」を選択。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/11403907-c336-1204-9f57-d54337fb9eb0.png"/>

3\. ダウンロードした拡張機能を選択してインストール。完了すると拡張一覧に表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/68c15dfd-7330-0a02-1c75-86ab1d1af820.png)

## BDC へ接続

1\. 左ペインに表示される「SQL Server BDC App Explorer」をクリックして、「DEPLOYED APPS」より「Connect to Cluster」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/1de43fd0-ec9b-5854-e1d7-bd157a91b377.png)

2\. 認証モードで「Basic」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/f3a0185f-8814-9886-7e2c-541901d891ab.png)

3\. Host に Cluster Management Service エンドポイントのアドレスをポート付きで指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/87af239e-8e2a-315b-c524-635cc2c4d920.png)

4\. ユーザー名とパスワードを入力して、接続完了を確認。展開済のアプリが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/885ac97e-05a8-2420-dcd8-4c2fb2a182bf.png)

## アプリの作成と展開

VSC からアプリの作成と展開ができます。

1\. 「New App Template」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/7d925d77-3d62-b024-e0e6-2c91a612fb95.png)

2\. ウィザードに従って、アプリ名、言語をそれぞれ、「Multiplypy」、「Python」を選択。

3\. フォルダを指定する画面が出るので、任意のディレクトリを指定。ファイルが展開されることを確認。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3a126ec9-7e33-f304-e0ff-a6d0ba967d51.png"/>

4\. VSC で作成されたフォルダを開き、hello.py を multiply.py にリネーム。以下コードを張り付け。

```python:multiply.py
def multiply(x, y):
    result = x*y
    return result
result=multiply(x,y)
```

5\. spec.yaml を以下に差し替え。

```yaml:spec.yaml
#spec.yaml
name: multiply-app
version: v1
runtime: Python
src: ./multiply.py
entrypoint: multiply
replicas: 1
poolsize: 1
inputs:
   x: int
   y: int
output:
   result: int
```

6\. spec.yaml 内に表示されている「Deploy App」リンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b19dc30d-a40b-175a-5fab-310cd19d2f9e.png)

7\. 展開が完了したら通知が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/7a430e4a-1b85-92e4-239b-17a4ff42ff19.png)

## アプリのテスト実行

テンプレートで同時に作成された run-spec.yaml を使って実行できます。

1\. run-spec.yaml を以下コードに差し替え。

```yaml:run-spec.yaml
name: multiply-app
version: v1
inputs:
  x: 5
  y: 10
```

2\. コード上に出ている「Run App」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/52b76322-9ea6-858f-d7af-b612a44e5d7d.png)

3\. 結果を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/eb96b869-89bb-6774-8d5c-bfc28c26e96e.png)

## アプリの情報確認

VSC では Swagger やアプリの情報も簡単に表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e10e1c68-48cc-e31e-bf50-b2390a2efa6a.png)

# アプリの削除

不要になったアプリは azdata や VSC から削除します。

```shell
azdata app delete -n add-app -v v1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/d5d6f393-c620-910d-ab1a-560d46c3a330.png)

# まとめ

アプリケーションによって SQL Server 2019 BDC の機能を容易に拡張できます。また外部からアクセスする REST エンドポイントを提供できるため、システム統合に非常に便利です。Python 以外にも多くのアプリケーションをサポートしているため、是非色々試してください。

[次の記事へ](https://qiita.com/kenakamu/items/7a4d7fd5505b58ad48b9)
[目次へ戻る](https://qiita.com/kenakamu/items/e155740aa60c85a3d867)

# 参照

[GitHub: sql-server-samples](https://github.com/Microsoft/sql-server-samples/tree/master/samples/features/sql-big-data-cluster/app-deploy)