Azure Synapse Data Explorer Pool(SDX Pool)

#はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d9582f7b-cb8a-4e1e-dfcb-97789d674e6e.png)
Azure Synapse Analyticsに新しい仲間プールを加えるようになりました。
それが、Synapse Analytics Runtimeファミリーに、SQL PoolとSpark Poolのほかに、Azure Data ExplorerをSynapse Poolの一つとして、Synapse Data Explorer Poolを加えています。
記事を書いている現時点では、Public Previewです。本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります。

https://docs.microsoft.com/en-us/azure/synapse-analytics/data-explorer/data-explorer-overview

#SDX Poolとは
Azure Synapse Data Explorer (SDX) は、アプリケーション、Web サイト、IoT デバイスなどから大量のデータ ストリーミングをリアルタイムで分析するための、高速で完全に管理されたデータ分析サービスです。製品の向上、カスタマー エクスペリエンスの向上、デバイスの監視、運用の向上を目的として、その場でKQLをしてデータを反復的に調査します。データのパターン、異常、傾向をすばやく特定できます。新しい質問を探索し、数分で回答を得ます。コスト構造が最適化されたおかげで、必要な数のクエリを実行できます。

#SDX Poolの導入背景
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/72285bdd-8e40-fdab-ba0d-f1c17f6c47e6.png)
テレメトリ データは、IoT センサー、アプリ/Web/インフラ ログ、セキュリティ ログ、メトリック、クリック ストリーム、時系列など、あらゆる場所に位置し、家庭、スマート ビルディング、スマート ファクトリ、および消費者や企業が依存するデバイスで、接続されたデバイスの進歩を促進します。
毎日テラバイトとペタバイトのデータを生成しており、運用の改善と革新のためにほぼリアルタイムで分析する必要があります。

#SDX Poolの主な機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/c24fc2a6-20c5-43ec-1189-736308cdb039.png)

+ フリー テキストや半構造化データを含むすべてのデータをインデックス化する強力な分散クエリ エンジンを使っています。データは自動的に圧縮、インデックス付け、自動最適化され、ローカル SSD にキャッシュされ、ストレージに保持されます。コンピューティングとストレージは分離され、ダウンタイムなしで自動スケール イン/アウトに完全な弾力性を提供します。
+ Synapse データを使用して、生のテレメトリと時系列データを探索するために高度に最適化された直観的な Kusto クエリ言語 (KQL) は、効率的な自由テキスト検索、正規表現、およびトレース\テキスト データの解析のためのクラス最高のテキスト インデックスを探索します。
+ 配列やネストされた構造を含む半構造化データを照会するための包括的な JSON 解析機能を持ちます。
+ モデルスコアリング用のインエンジン Python および R 実行サポートを備えた複数の時系列の作成、操作、および分析をサポートします。そして、ネイティブで高度な時系列もサポートします。
+ 地理情報のmap（地理空間クエリ）の操作もサポートします。

#SDX Poolの業界全体の一般的なユースケース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/6eb11ab1-0c65-1609-9716-5e1d9ecac729.png)
様々なIndustryで、時系列、トレース、メトリック、ログ、IoTなどのテレメトリデータの検索に向いています。

#SDX Poolのテクニカルユースケース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/883568b3-5240-899a-078b-3af7c24dd3e2.png)
SDX Poolの特徴からみると、ほぼリアルタイムのBigData分析や、観察、監視、IoT分析などにも向いていて、分析SaaSソリューションとして組めます。

#SDX Poolのアーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/66e7b2c6-0e23-ece5-387f-d159631d754a.png)
SDX Poolは、コンピュートとストレージのリソースを分離することで、スケールアウトアーキテクチャを実装しています。これにより、各リソースを独立して拡張し、例えば、同じデータに対して複数の読み取り専用コンピュートを実行することができます。
SDX Poolは、分散クエリの自動インデックス作成、圧縮、キャッシュ、サービスを担うエンジンを実行するコンピュート群から構成されます。
また、バックグラウンドシステムジョブ、マネージドデータ、キューイングデータの取り込みを担当するデータ管理サービスを実行する2つ目の計算ノード群も持っています。
すべてのデータは、圧縮されたカラムナーフォーマットを使用して、管理されたブロブストレージアカウントに永続化されます。
SDX Poolは、コネクタ、SDK、REST API、その他の管理された機能を使用してデータを取り込むための豊富なエコシステムをサポートしています。
また、アドホッククエリ、レポート、ダッシュボード、アラート、REST API、SDKなど、さまざまな方法でデータを利用することが可能です。
さらに、SQL、CosmosDB、Azure Monitor、Data Lakeからのデータクエリもサポートしています。

#SDX PoolにデータのIngest方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/57706cef-9b86-cf62-a131-52c77e72430a.png)
Ingest方法は4種類があります。

+ 開発言語、例えば、C#.NETやPython、Go、Node.js、Javaなどの言語で、SDKライブラリーを利用し、SDX PoolのEndpointにデータをIngestします。
+ 当然Azureサービスであるため、AzureのManagedサービスを利用することもできます。Iot Hub、Event Hub、Event Grid、Blob Storageなども対応します。
+ サードパーティ製の接続とプラグインも対応しています。例えば、Kafka、Spark、Logstash、Power Automateなどがあります。
+ ADFやSynapseのLinked Serviceを利用したPipelineの利用可能です。現状では、SDX Poolに接続するには、マニュアル接続する方法をお勧めします。「From Azure Subscription」にすると、ADXクラスタを選ぶことになり、SDX Poolが表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/a796ce7f-cc47-9d24-a054-218301191210.png)

また、Azure Data Explorerを使えば、ウィザードUIも揃えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/e1e12314-1fd8-614a-db0a-d563262f52ae.png)

#SDX Poolのクロスクエリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/8688de4e-058a-79bb-b424-dd67e57398e7.png)
一つAzure Synapse Analyticsに統合されることによって、様々なクエリパターンが生まれます。
特に、Synapse SQL Poolとクロスクエリができるように、分析する際に、データの移動を含む(ETL、ELT)は不要となり、そのままクエリ間のデータを結合できます。

下記はSQL Poolとクロスクエリのサンプルです。

```kql:KQL
let SQLPoolTable = evaluate sql_request(
'Server=tcp:{your syanpse dedicated sql pool},1433;'
'Authentication="Active Directory Integrated";'
'Initial Catalog={your synapse database name};',
'select [PostCode] as [PostCode],[AddressName] as [AddressName] from [dbo].[KQLAddressDetail]');
Employee
| join kind=inner Address on $left.['id'] == $right.['id']
| join kind=inner SQLPoolTable on $left.['postcode'] ==  $right.['PostCode']
| project  ['id'], ['name'], ['postcode'], ['AddressName'] 
```

https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/sqlrequestplugin?pivots=azuredataexplorer

#SDX Poolの操作クライアント
UI操作できるクライアントは3種類あります。

+ Synapse Studio
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/72a23da6-73e7-9e5f-26a8-26349cec5cba.png)

+ Azure Data Explorer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d9392e2a-1b45-cf7a-f77c-d8597582f63a.png)

+ Kusto Explorer
Download: 

https://aka.ms/ke

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/006de535-a8c6-03b4-f8c1-c732d4319496.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/c4a5b5ed-7549-8f82-2d1e-4ad4aad60932.png)
Add Connectionメニューで、SDX PoolのEndpointを指定し、認証を設定すれば接続できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/58c05845-b69c-a82c-95ee-81cb64e66d27.png)
Ref URL: 

https://docs.microsoft.com/en-us/azure/data-explorer/kusto/tools/kusto-explorer

#リアルタイムでIoTのテレメトリーデータをSDX PoolにIngestするサンプルStep
今回は物理デバイスを用意せず、Raspberry Pi オンライン シミュレーターを使って、温度データを取得し、IoT Hubに送信してから、Azure Stream Analytics Jobを使って、Event Hubに送信し、最後に、SDX Poolのデータ受け口をEvent Hubにして、SDX PoolのDatabaseの指定したTableにデータをIngestしていきます。
Raspberry Pi オンライン シミュレーターは[こちら](https://azure-samples.github.io/raspberry-pi-web-simulator/#getstarted)からアクセスできます。

>[Step1] Azure IoT Hubのデプロイ(下記のURLを参照してください)

https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-create-through-portal

>[Step2] Azure IoT Hubにデバイスを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/6c3fdac3-16d3-8f3e-ff9a-8312e84462eb.png)
ここで、プライマリ接続文字列をメモしておきます。

>[Step3] Raspberry Pi オンライン シミュレーターのNode.jsのConnectStringを編集する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d4ec8db0-f371-7694-dbaa-01f47011bd7e.png)
ここで、先ほどのデバイスのプライマリ接続文字列を貼り付けます。

>[Step4] Raspberry Pi オンライン シミュレーターのRunボタンを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/befbfcd2-5657-91bd-9262-3d4580a75874.png)

そうすると、Iot Hubへ温度のテレメトリーデータを送信が開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/cb7085ff-9ed6-897d-d5e3-18d63d92073d.png)

>[Step5] Raspberry Pi オンライン シミュレーターから送ってきたテレメトリーデータを確認する

確認するには、Azure IoT Explorerを使います。
GitHubからダウンロードできます。
Download URL: 

https://github.com/Azure/azure-iot-explorer/releases

接続するには、IoT Hubの接続文字列の指定が必要があります。
まずは、IoT Hubの共有アクセスポリシーからポリシーを選びます。ここで、とりあえず一番強い権限を持っているiothubownerにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/5d842f30-1641-34b0-2ba3-b123136e380e.png)
それから、プライマリ接続文字列をメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/b86f2756-885d-fab2-bc5d-5ddc42f34cc7.png)
その後、Azure IoT ExplorerのAdd Connection stringに追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/6984f466-a3d2-9344-5672-0d3eb6345690.png)
そうすると、Homeには、IoT Hubが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/9a1632be-8ea0-3a69-385b-7dba7388bdd8.png)
IoT Hubをクリックすると、IoT Hubに存在しているデバイス（IoT Edgeがある場合、Edgeも含みます）が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/3abf6ef3-65bd-e8d5-9d9c-cbaa2f047323.png)
先ほど作ったIoTSimulatorデバイスに対して、TelemetryをStartすると、IoT Hubがデバイスからメッセージを受信していることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/9908a0e3-31f1-5f75-90c8-b9239140383b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/234a86f7-5f48-03fc-2558-f105e6340217.png)
ここまで、デバイスとIoT Hubの間の通信が確認でき、それから、IoT Hubに到着したメッセージをAzure Event Hubに送るようにします。

>[Step6] Azure Event Hubのデプロイ（下記のURLを参照してください）

https://docs.microsoft.com/ja-jp/azure/event-hubs/event-hubs-create

>[Step7] Azure Event Hubの名前空間に、Event Hubインスタンスを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/9142ac6d-1612-f0f9-2109-570c4790a67e.png)
ここで、iotというインスタンスを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/81fd8c78-17dd-0a12-5217-9ed807f7a38c.png)

>[Step7] IoT HubからEvent Hubにリアルタイムでデータを転送するために、Azure Stream Analytics Jobをデプロイする(下記のURLを参照してください)

https://docs.microsoft.com/ja-jp/azure/stream-analytics/stream-analytics-quick-create-portal

>[Step8] Azure Stream Analytics Jobの入力と出力を定義する

入力は、IoT Hubにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/74286a51-18da-7d32-06d8-6500f5cfabad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/c0fd04f0-ddee-1298-a3e3-8130c692d187.png)
設定した後に、テストボタンを押して、正常性を確認してください。

出力は、Event Hubにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/61ff1c71-a78c-598e-515d-bda5a317a7b2.png)
それも、設定した後に、テストボタンを押して、正常性を確認してください。

SQLクエリに似ていますが、AnalyticsクエリをFROMとINTOを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/ce2d0322-2041-c047-5cf0-17e839e712bf.png)
ここでは、IoTHubからEvent HubにdevicedIdがRaspberry Pi Web Clientという文字列のデバイスのテレメトリーデータを転送するように指示します。

最後に、Stream Analytics Jobを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d3470f56-945e-3681-97e8-4fe146acdfe9.png)
開始してから、監視のメトリックスが表示され、データがリアルタイムで転送されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/34633caf-0ae8-19d6-eea2-0e391f7091bc.png)

>[Step9] SDX Poolのデプロイ(下記のURLを参照してください)

https://techcommunity.microsoft.com/t5/azure-synapse-analytics-blog/getting-started-with-azure-synapse-data-explorer/ba-p/2922605

Azure Portalからもデプロイできますが、Synapse Studioの管理UIからデプロイできます。注意：デプロイは10分～15分ぐらいかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d34e9a39-c746-fe08-0888-69124ceae969.png)

>[Step10] SDX PoolのDatabaseを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/6d8eb359-280f-8e3e-5473-258c8e87c907.png)
ここで、RealTimeLogというDatabaseを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/5bd3d3d3-b158-c1b1-6ce8-fb0cd0e5d8f4.png)

>[Step11] SDX PoolにEvent HubのテレメトリーデータをIngestする

Azure Data Explorerを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/faccad87-d626-886e-4130-ea2630aa7dbb.png)
開いたら、左側のメニューのデータを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/1e1e6d0d-c2e5-fe06-a256-944d0d7af55e.png)
Data Ingest方法から、Event Hubを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/c9294be2-ab28-8be2-4d95-722bf478b4c4.png)
Create New Tableを選択し、ここで、RaspberryPiというTableに名付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/72c3dce9-e4c4-89a4-aa28-cffe3b635187.png)
それから、SourceにEvent Hubを指定し、コンシューマーグループを分ける場合もありますので、基本的には、Defaultでよいですが、Defaultが使われている場合、別のコンシューマーグループをEvent Hubに定義しておく必要があります。下記のキャプチャでは、別のコンシューマーグループを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/d50c1166-05e0-b584-e691-6a6d9aa8b2a9.png)
それから、Schemaを選択します。JSONファイルなので、少し加工する必要があります。ここで、Nested Levelをあげると、JSON中の詳細データを取り出すことができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/187154d3-9a9a-eebd-42ba-e6e42ee760c3.png)
最後に、Summaryして、接続完了とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/68d438f5-37fb-98ea-ccd5-ddf23b648fbc.png)

>[Step12] SDX Poolのデータを確認する

Synapse Studioに戻って、RaspberryPiというテーブルができるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/a86df43f-c25c-a10e-2c86-68b3d6be8dd4.png)
KQLで、中身のデータを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/03eef499-0f35-c223-125c-196847584afe.png)
リアルタイムで、データが徐々に増えていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/b058dfd8-8779-7fa8-ed71-18669c00abd5.png)

IoTからのテレメトリーデータをSDX PoolにIngestのサンプル手順はここまでとします。

#SDX Poolの価格
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/eba16944-fe9a-c30f-5189-c23c43dddb90.png)
専用容量となり、SDX Poolの裏側で使われているクラスターインスタンスのリソースの課金となります。Dedicated SQL Poolと同じ考え方です。
計算ノード＋ストレージ＋ネットワークの料金となります。

#SDX PoolはEnterprise Ready！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236646/1587453f-646d-8e6f-71b5-7a28ddead78e.png)
SDX Poolはユーザーが必要とするすべての主要な機能を備えているため、すぐにでも運用できるようになっています。

#最後に
Japan SQL Server User Group Communityでは、SDX Poolのセッションも行います。ぜひ、Join US!

https://sqlserver.connpass.com/event/228773/