SQL Server 2016 では PDW に含まれていた、PolyBase の機能が使用できるようになります。
詳細については PolyBase を参照していただければと。
PolyBase では、Hadoop と Azure BLOB ストレージに接続をすることができます。
BLOB ストレージに接続するための手順を軽くまとめてみたいと思います。
手順については、Using #PolyBase in #SQLServer2016? / Polybase in SQL Server 2016 CTP 2 が直近の情報になるかと思います。
去年の情報になりますが PolyBase in APS – Yet another SQL over Hadoop solution? も参考になるかと。
PolyBase を使用するためには、Getting started with PolyBase に書かれているように JRE が必要となります。
Oracle Java SE RunTime Environment (JRE) version 7.51 or higher. Go to downloads. The installer will fail if JRE is not present.
JRE のインストール と SQL Server 2016 CTP 2.0 の PolyBase をインストールする際の照合順序について が終わっていれば、導入自体はサクッと終るかと思います。
PolyBase は最初に sp_configure で PolyBase Configuration Options (Transact-SQL) の設定を最初にする必要があります。
これにより接続先が設定されます。
今回は Azure ストレージの BLOB に接続を行いますので「4」に設定しています。
sp_configure 'hadoop connectivity', 4; reconfigure
変更後の注意点としては、
After running RECONFIGURE, you need to stop and restart the PolyBase Engine service.
があり、Plybase Engine service を再起動する必要があるのが注意点かと。
# SQL Server のサービスも再起動しないと駄目かもしれないです。
これで事前準備は完了ですので設定を行っていきます。
CREATE DATABASE TEST DBCC TRACEON(4631,-1) USE TEST CREATE MASTER KEY ENCRYPTION BY PASSWORD='MyP@ssword123'; CREATE CREDENTIAL AzureBlob -- 任意の設定 ON DATABASE WITH IDENTITY = 'AzureBLOB', -- 任意の設定 SECRET='<Azure ストレージのストレージアカウントキー>; CREATE EXTERNAL DATA SOURCE AzureData WITH ( TYPE = HADOOP, LOCATION = 'wasbs://<コンテナー>@<ストレージアカウント>.blob.core.windows.net/', CREDENTIAL = AzureBlob );
この設定で、接続に必要なデータソースの定義ができます。
TF 4631 は、CREATE CREDENTIAL を ON DATABASE で実行するために必要となる TF になります。
これで、Azure ストレージに接続するための資格情報が作成できますので、その資格情報を使用して外部データソースの定義を行います。
ストレージアカウントの設定については、LOCATION で設定するため、資格情報の名称や IDENTITY はストレージアカウントとは異なる名称で問題ありません。
# 資格情報はストレージアカウントキーのみが、接続するストレージの情報の必要があります。
今回は「test」というコンテナーに格納されている「test.tbl」というファイルに対して接続を行います。
このファイルは、以下のように CSV 形式のファイルとなっています。
このファイルを外部テーブルとして認識できるように、外部ファイルが CSV ということ設定を追加します。
CREATE EXTERNAL FILE FORMAT CSV WITH ( FORMAT_TYPE = DELIMITEDTEXT, FORMAT_OPTIONS ( FIELD_TERMINATOR = ',' ) );
これで外部リソースとして、「データソース」「ファイル形式」が追加できた状態となります。
最後にこれらを使用して外部テーブルを定義します。
CREATE EXTERNAL TABLE AzureBlob ( Col1 int, Col2 varchar(100) ) WITH ( LOCATION = '/test.tbl', DATA_SOURCE = AzureData, FILE_FORMAT = CSV )
以上で、BLOB のファイルをテーブルとしてマッピングするための設定は完了です。
これにより、BLOB のデータを SQL で操作できるようになります。
以下のようなクエリを実行すれば、クエリから件数を取得することができます。
SELECT COUNT(*) FROM AzureBLOB
この際の実行プランは以下のようになります。
Remote Query として、PolyBase により実行されていることが確認できます。
クエリの流れを見ていた限りは大量データの検索はちょっと厳しそうな感じを受けましたが。
BLOB のデータをクエリ経由で変更することはできないようですが、SELECT INTO 等で、BLOB のデータをテーブルに移動することはできます。
SELECT * INTO BlobTmp FROM AzureBLOB
まだ、情報をあまり追えていないのですが、Hadoop と異なり、Azure ストレージのデータを扱う場合の、分散処理は難しいのでしょうかね。(できる場合、どのような感じになるのだろう。。。。)
分散処理は、CTP 3 を待つことになるのかも.
“To improve query performance, in CTP3, users will be able to create a cluster of SQL Server instances working together to process large data sets from external data sources, such as Hadoop or Azure Blob Storage, in a scale-out fashion”
https://msdn.microsoft.com/en-us/library/mt143171(v=sql.130).aspx
Yoshihiro Kawabata
12 6月 15 at 05:25
情報ありがとうございます。
CREATE EXTERNAL TABLE も CTP3 で変わるようなので、CTP3 が触れるようになったら、こちらと合わせて再度確認してみます。
In CTP2, the export functionality is not supported, i.e. permanently storing SQL data into the external data source. This functionality will be available in CTP3.
https://msdn.microsoft.com/en-us/library/dn935021(v=sql.130).aspx
masayuki.ozawa
12 6月 15 at 07:51