API を使用して Apache Spark アプリケーションのメトリックを収集する

概要

このチュートリアルでは、Synapse Prometheus コネクタを使用して、既存のオンプレミス Prometheus サーバーを Azure Synapse ワークスペースと統合し、ほぼリアルタイムの Apache Spark アプリケーション メトリックを取得する方法について説明します。

このチュートリアルでは、Azure Synapse REST メトリック API についても説明します。 独自の監視および診断ツールキットを構築したり、お使いの監視システムと統合するために、REST API を使用して Apache Spark アプリケーション メトリック データを取得することができます。

オンプレミスの Prometheus サーバーで Azure Synapse Prometheus コネクタを使用する

Azure Synapse Prometheus コネクタはオープンソースのプロジェクトです。 Synapse Prometheus コネクタでは、以下を可能にするために、ファイルベースのサービス探索方法を使用します。

  • AAD サービス プリンシパルを介して Synapse ワークスペースに対する認証を行います。
  • ワークスペースの Apache Spark アプリケーションの一覧を取得します。
  • Prometheus のファイルベースの構成を使用して Apache Spark アプリケーションのメトリックを取得します。

1.前提条件

Prometheus サーバーが Linux VM にデプロイされている必要があります。

2.サービス プリンシパルの作成

オンプレミスの Prometheus サーバーで Azure Synapse Prometheus コネクタを使用するには、次の手順に従ってサービス プリンシパルを作成する必要があります。

2.1 サービス プリンシパルを作成する

az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>

結果は次のようになります。

{
  "appId": "abcdef...",
  "displayName": "<service_principal_name>",
  "name": "http://<service_principal_name>",
  "password": "abc....",
  "tenant": "<tenant_id>"
}

アプリ ID、パスワード、テナント ID をメモしておきます。

2.2 対応するアクセス許可を、前の手順で作成したサービス プリンシパルに追加する

screenshot grant permission srbac

  1. Synapse Administrator として Azure Synapse Analytics ワークスペース にログインします

  2. Synapse Studio の左側のペインで、[管理] > [アクセス制御] を選択します

  3. 左上にある [追加] ボタンをクリックして、ロールの割り当てを追加します

  4. [スコープ] で、 [ワークスペース] を選択します

  5. [ロール] で、 [Synapse Compute Operator] を選択します

  6. [ユーザーの選択] で、<service_principal_name> を入力してサービス プリンシパルをクリックします

  7. [適用] をクリックします (アクセス許可が有効になるまで 3 分間待機します。)

3.Azure Synapse Prometheus コネクタをダウンロードする

コマンドを使用して、Azure Synapse Prometheus コネクタをインストールします。

git clone https://github.com/microsoft/azure-synapse-spark-metrics.git
cd ./azure-synapse-spark-metrics/synapse-prometheus-connector/src
python pip install -r requirements.txt

4.Azure Synapse ワークスペースの構成ファイルを作成する

config フォルダーに config.yaml ファイルを作成し、workspace_name、tenant_id, service_principal_name、service_principal_password の各フィールドに入力します。 yaml 構成では、複数のワークスペースを追加できます。

workspaces:
  - workspace_name: <your_workspace_name>
    tenant_id: <tenant_id>
    service_principal_name: <service_principal_app_id>
    service_principal_password: "<service_principal_password>"

5.Prometheus 構成を更新する

Prometheus の scrape_config で次の構成セクションを追加し、<your_workspace_name> はワークスペース名に、<path_to_synapse_connector> は、クローンした synapse-prometheus-connector フォルダーに置き換えます

- job_name: synapse-prometheus-connector
  static_configs:
  - labels:
      __metrics_path__: /metrics
      __scheme__: http
    targets:
    - localhost:8000
- job_name: synapse-workspace-<your_workspace_name>
  bearer_token_file: <path_to_synapse_connector>/output/workspace/<your_workspace_name>/bearer_token
  file_sd_configs:
  - files:
    - <path_to_synapse_connector>/output/workspace/<your_workspace_name>/application_discovery.json
    refresh_interval: 10s
  metric_relabel_configs:
  - source_labels: [ __name__ ]
    target_label: __name__
    regex: metrics_application_[0-9]+_[0-9]+_(.+)
    replacement: spark_$1
  - source_labels: [ __name__ ]
    target_label: __name__
    regex: metrics_(.+)
    replacement: spark_$1

6.Prometheus サーバー VM でコネクタを開始する

次のようにして、Prometheus サーバー VM でコネクタ サーバーを起動します。

python main.py

数秒待つと、コネクタが動作を開始します。 Prometheus サービス検出ページで "synapse-prometheus-connector" を確認できます。

Azure Synapse Prometheus または REST メトリック API を使用してメトリック データを収集する

1.認証

クライアント資格情報フローを使用して、アクセス トークンを取得できます。 メトリック API にアクセスするには、サービス プリンシパルに対する Azure AD アクセス トークン (API にアクセスするための適切なアクセス許可があるもの) を取得する必要があります。

パラメーター 必須 説明
tenant_id True Azure サービス プリンシパル (アプリケーション) のテナント ID
grant_type True 要求されている付与の種類を指定します。 クライアント資格情報付与フローでは、値は client_credentials である必要があります。
client_id True Azure portal または Azure CLI で登録した、アプリケーションのアプリケーション (サービス プリンシパル) ID。
client_secret True アプリケーションに対して生成されたシークレット (サービス プリンシパル)
resource True Synapse リソース URI ("https://dev.azuresynapse.net" である必要があります)
curl -X GET -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=client_credentials&client_id=<service_principal_app_id>&resource=<azure_synapse_resource_id>&client_secret=<service_principal_secret>' \
  https://login.microsoftonline.com/<tenant_id>/oauth2/token

応答は次のようになります。

{
  "token_type": "Bearer",
  "expires_in": "599",
  "ext_expires_in": "599",
  "expires_on": "1575500666",
  "not_before": "1575499766",
  "resource": "2ff8...f879c1d",
  "access_token": "ABC0eXAiOiJKV1Q......un_f1mSgCHlA"
}

2.Azure Synapse ワークスペースで実行中のアプリケーションを一覧表示する

監視 - Apache Spark ジョブ リストの取得に関するドキュメントに従って、Synapse ワークスペース用の Apache Spark アプリケーションの一覧を取得します。

3. Prometheus または REST API を使用して Apache Spark アプリケーションのメトリックを収集する

Prometheus API を使用して Apache Spark アプリケーションのメトリックを収集する

Prometheus API によって、指定した Apache Spark アプリケーションの最新のメトリックを取得します

GET https://{endpoint}/livyApi/versions/{livyApiVersion}/sparkpools/{sparkPoolName}/sessions/{sessionId}/applications/{sparkApplicationId}/metrics/executors/prometheus?format=html
パラメーター 必須 説明
endpoint True ワークスペース開発エンドポイント (例: https://myworkspace.dev.azuresynapse.net.)
livyApiVersion True 要求の有効な api-version。 現時点では 2019-11-01-preview
sparkPoolName True Spark プールの名前。
sessionID True セッションの識別子。
sparkApplicationId True Spark アプリケーション ID

サンプルの要求:

GET https://myworkspace.dev.azuresynapse.net/livyApi/versions/2019-11-01-preview/sparkpools/mysparkpool/sessions/1/applications/application_1605509647837_0001/metrics/executors/prometheus?format=html

応答例:

状態コード: 200 応答は次のようになります。

metrics_executor_rddBlocks{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 0
metrics_executor_memoryUsed_bytes{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 74992
metrics_executor_diskUsed_bytes{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 0
metrics_executor_totalCores{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 0
metrics_executor_maxTasks{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 0
metrics_executor_activeTasks{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 1
metrics_executor_failedTasks_total{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 0
metrics_executor_completedTasks_total{application_id="application_1605509647837_0001", application_name="mynotebook_mysparkpool_1605509570802", executor_id="driver"} 2
...

REST API を使用して Apache Spark アプリケーションのメトリックを収集する

GET https://{endpoint}/livyApi/versions/{livyApiVersion}/sparkpools/{sparkPoolName}/sessions/{sessionId}/applications/{sparkApplicationId}/executors
パラメーター 必須 説明
endpoint True ワークスペース開発エンドポイント (例: https://myworkspace.dev.azuresynapse.net.)
livyApiVersion True 要求の有効な api-version。 現時点では 2019-11-01-preview
sparkPoolName True Spark プールの名前。
sessionID True セッションの識別子。
sparkApplicationId True Spark アプリケーション ID

要求のサンプル

GET https://myworkspace.dev.azuresynapse.net/livyApi/versions/2019-11-01-preview/sparkpools/mysparkpool/sessions/1/applications/application_1605509647837_0001/executors

サンプルの応答の状態コード: 200

[
    {
        "id": "driver",
        "hostPort": "f98b8fc2aea84e9095bf2616208eb672007bde57624:45889",
        "isActive": true,
        "rddBlocks": 0,
        "memoryUsed": 75014,
        "diskUsed": 0,
        "totalCores": 0,
        "maxTasks": 0,
        "activeTasks": 0,
        "failedTasks": 0,
        "completedTasks": 0,
        "totalTasks": 0,
        "totalDuration": 0,
        "totalGCTime": 0,
        "totalInputBytes": 0,
        "totalShuffleRead": 0,
        "totalShuffleWrite": 0,
        "isBlacklisted": false,
        "maxMemory": 15845975654,
        "addTime": "2020-11-16T06:55:06.718GMT",
        "executorLogs": {
            "stdout": "http://f98b8fc2aea84e9095bf2616208eb672007bde57624:8042/node/containerlogs/container_1605509647837_0001_01_000001/trusted-service-user/stdout?start=-4096",
            "stderr": "http://f98b8fc2aea84e9095bf2616208eb672007bde57624:8042/node/containerlogs/container_1605509647837_0001_01_000001/trusted-service-user/stderr?start=-4096"
        },
        "memoryMetrics": {
            "usedOnHeapStorageMemory": 75014,
            "usedOffHeapStorageMemory": 0,
            "totalOnHeapStorageMemory": 15845975654,
            "totalOffHeapStorageMemory": 0
        },
        "blacklistedInStages": []
    },
    // ...
]

4.独自の診断および監視ツールを構築する

Prometheus API と REST API は、実行中の Apache Spark アプリケーションに関する豊富なメトリック データを提供します。Prometheus API と REST API を使用して、アプリケーション関連のメトリック データを収集できます。 また、よりニーズに合った独自の診断および監視ツールを構築できます。