SQL Server 2019 ビッグデータクラスターを AKS で使う - HDFS の階層化

SQL Server 2019 BDC ではストレージプールを使った HDFS のアクセスだけでなく、HDFS の階層化機能により Azure Data Lake Storage Gen2 (ADLS Gen2) や AWS S3 にあるファイルにもアクセスすることができます。

[参照: SQL Server ビッグ データ クラスター で HDFS の階層化を構成する](https://docs.microsoft.com/ja-jp/sql/big-data-cluster/hdfs-tiering?view=sql-server-ver15)

# SQL Server 2019 BDC

クラスタは [azdata 既定の構成でインストール](https://qiita.com/kenakamu/items/fd7834f07e391b90337a) で構築したものを使います。

# ADLS Gen2 の作成

今回はクラスタと同じリソースグループに ADLS Gen2 を作成します。

1\. 以下コマンドでストレージアカウントの作成。

```shell
az storage account create -n sqlbdcadlsg2 -g sqlbdcrg --location japaneast --sku Standard_LRS --kind StorageV2 --enable-hierarchical-namespace true
```

2\. キーを取得。

```shell
az storage account keys list -n sqlbdcadlsg2 -g sqlbdcrg
```

3\. コンテナを作成。

```shell
az storage container create -n myhdfsfiles --account-name sqlbdcadlsg2 --account-key <上記で取得したキー>
```

4\. 作成したコンテナにファイルをアップロード。ここでは Azure Storage Explorer を使って、既存のサンプルでストレージプールに作成された web_clickstreams.csv を利用。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/9973ffe6-73b4-e004-2850-35fd0f008c42.png)

# ストレージのマウント

ストレージのマウントで利用できる認証はいくつか方法がありますが、今回は一番シンプルなキーを直接使う方法を試します。OAuth を使いたい場合は参考ページを見てください。

1\. 以下のコマンドを実行。

```shell
set MOUNT_CREDENTIALS=fs.azure.abfs.account.name=sqlbdcadlsg2.dfs.core.windows.net,fs.azure.account.key.sqlbdcadlsg2.dfs.core.windows.net=<上記で取得したキー>
```

2\. BDC コントローラーの外部 IP を取得。

```shell
kubectl get svc controller-svc-external -n mssql-cluster
```

3\. コントローラーにログイン。

```shell
azdata login -e https://<IP-of-controller-svc-external>:30080
```

4\. マウントを実行。

- ここではマウント先の名前を externalhdfsfile に指定

```shell
azdata bdc hdfs mount create --remote-uri abfs://myhdfsfiles@sqlbdcadlsg2.dfs.core.windows.net/ --mount-path /mounts/externalhdfsfile
```

5\. マウントのステータスを確認。

```shell
>azdata bdc hdfs mount status
[
  {
    "mount": "/mounts/externalhdfsfile",
    "remote": "abfs://myhdfsfiles@sqlbdcadlsg2.dfs.core.windows.net/",
    "state": "Ready"
  }
]
```

6\. ADS から階層化された HDFS にアクセスできることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/dfa5d933-ab8b-7e24-71ec-de59d766474c.png)

# マウントされたストレージからクエリを実行

1\. テスト用のデータベースと外部テーブルを作成。

- 場所で /mounts/externalhdfsfile/clickstream_data を指定

```sql
CREATE DATABASE HDFSTieringTestDB;
GO
USE HDFSTieringTestDB;
GO

CREATE EXTERNAL FILE FORMAT csv_file
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS(
        FIELD_TERMINATOR = ',',
        STRING_DELIMITER = '"',
        FIRST_ROW = 2,
        USE_TYPE_DEFAULT = TRUE)
);

IF NOT EXISTS(SELECT * FROM sys.external_data_sources WHERE name = 'SqlStoragePool')
BEGIN
  CREATE EXTERNAL DATA SOURCE SqlStoragePool
  WITH (LOCATION = 'sqlhdfs://controller-svc/default');
END

CREATE EXTERNAL TABLE [web_clickstreams_hdfs]
("wcs_click_date_sk" BIGINT , "wcs_click_time_sk" BIGINT , "wcs_sales_sk" BIGINT , "wcs_item_sk" BIGINT , "wcs_web_page_sk" BIGINT , "wcs_user_sk" BIGINT)
WITH
(
    DATA_SOURCE = SqlStoragePool,
    LOCATION = '/mounts/externalhdfsfile/clickstream_data',
    FILE_FORMAT = csv_file
);
GO

SELECT * FROM web_clickstreams_hdfs;
```

2\. 結果を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/431ba53e-8154-f4d3-ebb2-49cdc1f7da28.png)

# まとめ

パフォーマンスを求める場合、HDFS ファイルは記憶域プールにおけますし、クエリ結果はデータプールにも配置できますが、いずれもクラスタノードにアタッチされたディスクでやりコストに影響します。すでに ADLS Gen2 にファイルがある場合は、うまく組み合わせて使えるとより柔軟性が上がります。次回はアプリケーションの展開を見ていきます。

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