「S3 + Athena」 で実行していたことを 「BLOB + Azure Data Explorer」 で実現してみました ー 3


STEP-3 : Azure Data Explorer の Python ライブラリを使用してデータベースへのクエリを実行する

概要

AWSの「S3 + Athena」 で実行できること、つまり、S3に保存されているJSON形式等のデータ(以下、JSONデータ)を Athenaで提供されているSQLライクな構文を用いてクエリ実行することによりデータ抽出が可能となっています。同様なことをAzure上の「BLOB + Azure Data Explorer」構成においても可能であることを確認しました。なお、「Web UI」と「Pythonプログラム」の両方で実現しております。

この実現を以下の3つのステップで順次説明します。
STEP-1.Azure Data Explorer クラスターとデータベースを作成する
STEP-2.Azure Data Explorer の Web UI でデータベースへのクエリを実行する
STEP-3.Azure Data Explorer の Python ライブラリを使用してデータベースへのクエリを実行する

STEP-1についてはこちらSTEP-2についてはこちら を参照ください。 今回は STEP-3 について説明します。

Azure Data Explorer では、Python 用のデータ クライアント ライブラリが提供されています。 このライブラリを使用すると、コードからデータをクエリできます。 そのクラスターでテーブルのクエリを実行し、結果を返すことができます。

ローカル環境

macOS Big Sur 11.1
python 3.8.3
Microsoft Edge 89.0.774.63(Safariでは Azure Data Explorer がうまく動きませんでした)

ローカル上での事前準備

データライブラリをインストールしておきます。

pip install azure-kusto-data

Azure上での事前準備

STEP-1を完了していること
今回のクエリー対象となるデータは、この記事 にある「IoTSample-write.py」で 2222件生成したものとなります。
なお、Azure Data Exploere の作成内容は以下となっています。

名称
クラスター名 ituruadxcluster
データベース名 IoTDummyDatabase

Azure Data Exploere データライブラリ使用 のための事前準備

Azure Data Exploere データライブラリを利用するために必要な手順は以下となります。
1.アプリの新規登録
2.登録アプリのAPIアクセス許可設定
3.登録アプリのシークレット情報の取得
4.Azure Data Exploere クラスターへのアクセス制御設定
5.Azure Data Exploere クラスターへのアクセス許可設定
6.ローカル環境へのクレデンシャル情報の定義

アプリの新規登録

1.Azureポータルにサインインします。
2.リソースから [Azure Active Directory] を選択します。
3.画面左側から [アプリの登録] を選択します。
4.画面上部タブから [新規登録] を選択します。
5.[アプリケーションの登録] 画面にある [名前] 欄に [iTuruDataExplorerKustoAccess] と入力し、画面の下部にある [登録] を選択します。
6.登録されたアプリの概要が表示されます。この画面の [アプリケーション(クライアント)ID] と [ディレクトリ(テナント)ID] の値をコピーしておきます。

登録アプリのAPIアクセス許可設定

1.画面の左側から [APIのアクセス許可] を選択します。
2.画面中央の [アクセス許可の追加] を選択します。
3.[APIアクセス許可の要求] 画面から [Azure Data Explorer] を選択します。

4.表示された [Azure Data Explorer] のアクセス許可にチェックを入れ、画面下部にある [アクセス許可の追加] を選択します。

5.表示されている画面中央にある [xxxxxxxに管理者の同意を与えます] を押します。
6.アクセス許可に管理者の同意がえられた結果、以下の画面となります。

登録アプリのシークレット情報の取得

1.画面の左側から [証明書とシークレット] を選択します。
2.画面中央下の [新しいクライアントシークレット] を選択します。
3.[クライアントシークレットの追加] 画面で、[説明] と [有効期限] を設定し、 [追加] を選択します

4.元の画面に先程追加したクライアントシークレットが表示されており、その[値] を [コピー] しておきます。

Azure Data Exploere クラスターへのアクセス制御設定

1.Azure Portal において、リソースから Azure Data Explorer の [ituruadxcluster] を選択します。
2.画面左側から [アクセス制御(IAM)] を選択します。
3.画面上部タブから [追加] - [ロールの割り当ての追加] を選択します。
4.[ロールの割り当ての追加] 画面にて、 [役割] 欄で [所有者] を選択し、[選択] 欄で [iTuruDataExplorerKustoAccess] を選択し画面の下部にある [保存] を選択します。

5.登録されたアクセス制御を確認します

Azure Data Exploere クラスターへのアクセス許可設定

1.画面左側から [アクセス許可] を選択します。
2.画面上部タブから [追加] を選択します。
3.[アクセス許可の追加] 画面にて、 [役割の選択] 欄で [AllDatabaseAdmin] を選択し、[プリンシパルを選択する] 欄で [iTuruDataExplorerKustoAccess] を選択します。

4.追加されたアクセス許可を確認します

ローカル環境へのクレデンシャル情報の定義

クレデンシャル情報を .zshenv に定義してプログラムを実行しています。環境に合わせて定義ください。

# Azure Data Exploere の データライブラリ使用によるクエリ実行のための定義(Kusto)
export KUSTO_CLUSTER_NAME="ituruadxcluster"
export KUSTO_DATABASE_NAME="IoTDummyDatabase"
export LOCATION_SMALL_CASE="japaneast"
export TENANT_ID=xxxxxxxxxxxxxxxxxxxxxxxxx   #「アプリの新規登録」でコピーした [ディレクトリ(テナント)ID] 
export CLIENT_ID=yyyyyyyyyyyyyyyyyyyyyyyyy   #「アプリの新規登録」でコピーした [アプリケーション(クライアント)ID]
export CLIENT_KEY=zzzzzzzzzzzzzzzzzzzzzzzz   #「登録アプリのシークレット情報の取得」でコピーした [値]

実行プログラム

実行するPythonプログラムは以下となります。
実行クエリーは STEP-2 の「Azure Data Explorer Web UI でデータベースへのクエリを実行」の「1」 のものとします。

KustoSample.py
from azure.kusto.data import KustoClient, KustoConnectionStringBuilder
from azure.kusto.data.exceptions import KustoServiceError
from azure.kusto.data.helpers import dataframe_from_result_table
import pandas as pd
import pprint
import time
import os

# Azure Data Explorer Info
TENANT_ID = os.environ['TENANT_ID']
CLIENT_ID = os.environ['CLIENT_ID']
CLIENT_KEY = os.environ['CLIENT_KEY']
LOCATION_SMALL_CASE = os.environ['LOCATION_SMALL_CASE']
KUSTO_CLUSTER_NAME = os.environ['KUSTO_CLUSTER_NAME']
KUSTO_DATABASE_NAME = os.environ['KUSTO_DATABASE_NAME']
KUSTO_URI = "https://{}.{}.kusto.windows.net".format(KUSTO_CLUSTER_NAME, LOCATION_SMALL_CASE)


# Blobコンテナーのデータの取得
def blobContainerData_kusto() :

    # Kusto接続のための定義
    kusto_connection_string_builder = KustoConnectionStringBuilder.with_aad_application_key_authentication(connection_string=KUSTO_URI, aad_app_id=CLIENT_ID, app_key=CLIENT_KEY, authority_id=TENANT_ID)
    print(kusto_connection_string_builder)

    # Azure Data Explorer に接続しクエリの実行
    kusto_client = KustoClient(kusto_connection_string_builder)
    query = "iot_tbl | sort by ['id'] desc | take 10"             # 実行クエリー
    print(kusto_client)
    print(query)

    # データフレームでダータの取得
    response = kusto_client.execute_query(KUSTO_DATABASE_NAME, query)
    df = dataframe_from_result_table(response.primary_results[0])
    return df

if __name__ == '__main__':
    start = time.time()
    df = blobContainerData_kusto()
    convert_time = time.time() - start

    print("")
    pprint.pprint(df)
    print("\n\rデータ取得時間:{0}".format(convert_time) + " [sec]")
    print("")

実行結果

Pythonプログラムを実行した結果は以下となります。

$ python KustoSample.py
Data Source=https://ituruadxcluster.japaneast.kusto.windows.net;AAD Federated Security=True;Application Client Id=7979797-ecce-c3c3-d1d1-33ffeeee6688;Application Key=****;Authority Id=3a3a3a3a-aacc-4545-7f7f-3030ccc63636
<azure.kusto.data.client.KustoClient object at 0x7fcfb0199610>
iot_tbl | sort by ['id'] desc | take 10

     id                             time     proc section   iot_num iot_state       vol_1      vol_2
0  2221 2021-02-26 17:36:02.518630+00:00  ADX2222       Q  133-1478       青森県  167.753668  55.555238
1  2220 2021-02-26 17:36:02.518618+00:00  ADX2222       W  052-1579       富山県  119.868415  67.729233
2  2219 2021-02-26 17:36:02.518608+00:00  ADX2222       F  635-5427       静岡県  168.603883  88.599550
3  2218 2021-02-26 17:36:02.518599+00:00  ADX2222       D  293-1684       高知県  114.518138  55.669590
4  2217 2021-02-26 17:36:02.518589+00:00  ADX2222       Q  254-0578       愛媛県  126.710203  83.226436
5  2216 2021-02-26 17:36:02.518578+00:00  ADX2222       D  376-9573       福井県  138.938321  80.591457
6  2215 2021-02-26 17:36:02.518568+00:00  ADX2222       H  149-6424       山梨県  132.941341  79.180356
7  2214 2021-02-26 17:36:02.518559+00:00  ADX2222       I  050-4286       大分県  155.100844  87.882249
8  2213 2021-02-26 17:36:02.518549+00:00  ADX2222       C  081-6939       長崎県  149.415190  61.082220
9  2212 2021-02-26 17:36:02.518540+00:00  ADX2222       M  284-7501       岡山県  115.914588  80.191101

データ取得時間:0.5570240020751953 [sec]

3つのステップにわたり、「S3 + Athena」 で実行していたことを 「BLOB + Azure Data Explorer」 で実現してみました。

本課題のシリーズ情報

3つのステップ
STEP-1.Azure Data Explorer クラスターとデータベースを作成する
STEP-2.Azure Data Explorer の Web UI でデータベースへのクエリを実行する
STEP-3.Azure Data Explorer の Python ライブラリを使用してデータベースへのクエリを実行する