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


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

参照: SQL Server ビッグ データ クラスター で HDFS の階層化を構成する

SQL Server 2019 BDC

クラスタは azdata 既定の構成でインストール で構築したものを使います。

ADLS Gen2 の作成

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

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

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

2. キーを取得。

az storage account keys list -n sqlbdcadlsg2 -g sqlbdcrg

3. コンテナを作成。

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

4. 作成したコンテナにファイルをアップロード。ここでは Azure Storage Explorer を使って、既存のサンプルでストレージプールに作成された web_clickstreams.csv を利用。

ストレージのマウント

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

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

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 を取得。

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

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

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

4. マウントを実行。

  • ここではマウント先の名前を externalhdfsfile に指定
azdata bdc hdfs mount create --remote-uri abfs://[email protected]/ --mount-path /mounts/externalhdfsfile

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

>azdata bdc hdfs mount status
[
  {
    "mount": "/mounts/externalhdfsfile",
    "remote": "abfs://[email protected]/",
    "state": "Ready"
  }
]

6. ADS から階層化された HDFS にアクセスできることを確認。

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

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

  • 場所で /mounts/externalhdfsfile/clickstream_data を指定
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. 結果を確認。

まとめ

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

次の記事へ
目次へ戻る