Sammeln von Apache Spark-Anwendungsmetriken mithilfe von APIs

Übersicht

In diesem Tutorial erfahren Sie, wie Sie Ihren vorhandenen lokalen Prometheus-Server über den Synapse-Prometheus-Connector in einen Azure Synapse-Arbeitsbereich integrieren, um Azure Spark-Anwendungsmetriken in Quasi-Echtzeit zu erhalten.

Außerdem werden in diesem Tutorial die Azure Synapse-REST-Metrik-APIs vorgestellt. Sie können Daten zu Apache Spark-Anwendungsmetriken über die REST-APIs abrufen, um ein eigenes Überwachungs- und Diagnosetoolkit zu erstellen oder in Ihre Überwachungssysteme zu integrieren.

Verwenden des Azure Synapse-Prometheus-Connectors für Ihre lokalen Prometheus-Server

Der Azure Synapse-Prometheus-Connector ist ein Open-Source-Projekt. Der Synapse-Prometheus-Connector verwendet eine dateibasierte Dienstermittlungsmethode, um Folgendes zu ermöglichen:

  • Authentifizieren beim Synapse-Arbeitsbereich über einen Microsoft Entra-Dienst Prinzipal.
  • Abrufen einer Liste von Apache Spark-Anwendungen im Arbeitsbereich
  • Abrufen von Apache Spark-Anwendungsmetriken über die dateibasierte Prometheus-Konfiguration

1. Voraussetzung

Ein Prometheus-Server muss auf einer Linux-VM bereitgestellt werden.

2. Erstellen eines Dienstprinzipals

Wenn Sie den Azure Synapse-Prometheus-Connector auf Ihrem lokalen Prometheus-Server verwenden möchten, sollten Sie die folgenden Schritte ausführen, um einen Dienstprinzipal zu erstellen.

2.1 Erstellen eines Dienstprinzipals

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

Das Ergebnis sollte wie folgt aussehen:

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

Notieren Sie sich die appId, das Kennwort und die Mandanten-ID.

2.2 Hinzufügen entsprechender Berechtigungen für den im obigen Schritt erstellten Dienstprinzipal

screenshot grant permission srbac

  1. Melden Sie sich als Synapse-Administrator beim Azure Synapse Analytics-Arbeitsbereich an.

  2. Wählen Sie in Synapse Studio im linken Bereich Verwalten > Zugriffssteuerung aus.

  3. Klicken Sie links oben auf die Schaltfläche „Hinzufügen“, um eine Rollenzuweisung hinzuzufügen.

  4. Wählen Sie als Bereich Arbeitsbereich aus.

  5. Wählen Sie als Rolle die Option Operator von Synapse-Computeressourcen aus.

  6. Geben Sie unter „Benutzer auswählen“ Ihren <Dienstprinzipalnamen> ein, und klicken Sie auf Ihren Dienstprinzipal.

  7. Klicken Sie auf Anwenden. (Warten Sie drei Minuten, bis die Berechtigung in Kraft tritt.)

3. Herunterladen des Azure Synapse-Prometheus-Connectors

Verwenden Sie die Befehle zum Installieren des Azure Synapse-Prometheus-Connectors.

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. Erstellen einer Konfigurationsdatei für Azure Synapse-Arbeitsbereiche

Erstellen Sie im Konfigurationsordner eine Datei „config.yaml“, und füllen Sie die folgenden Felder aus: „workspace_name“, „tenant_id“, „service_principal_name“ und „service_principal_password“. Sie können in der YAML-Konfiguration mehrere Arbeitsbereiche hinzufügen.

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

5. Aktualisieren der Prometheus-Konfiguration

Fügen Sie diesen Abschnitt der „scrape_config“ von Prometheus hinzu, und ersetzen Sie den <your_workspace_name> durch den Namen Ihres Arbeitsbereichs und <path_to_synapse_connector> durch den geklonten Ordner „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. Starten des Connectors auf der Prometheus-Server-VM

Starten Sie auf der Prometheus-Server-VM wie folgt einen Connectorserver.

python main.py

Warten Sie einige Sekunden, bis der Connector betriebsbereit ist. Auf der Seite der Prometheus-Dienstermittlung wird „synapse-prometheus-connector“ angezeigt.

Verwenden der Azure Synapse-Prometheus-API oder der REST-Metrik-APIs zum Erfassen von Metrikdaten

1. Authentifizierung

Sie können den Flow für Clientanmeldeinformationen verwenden, um ein Zugriffstoken zu erhalten. Für den Zugriff auf die Metrik-API sollten Sie ein Microsoft Entra-Zugriffstoken für den Dienstprinzipal abrufen, das über eine geeignete Berechtigung für den Zugriff auf die APIs verfügt.

Parameter Erforderlich BESCHREIBUNG
tenant_id True Die Mandanten-ID Ihres Azure-Dienstprinzipals (Anwendung)
grant_type True Gibt den angeforderten Gewährungstyp an. In einem Fluss zur Gewährung von Clientanmeldeinformationen muss der Wert client_credentials lauten.
client_id True Die Anwendungs-ID (Dienstprinzipal) der Anwendung, die Sie im Azure-Portal oder über die Azure CLI registriert haben
client_secret True Das für die Anwendung (Dienstprinzipal) generierte Geheimnis
resource True Der Synapse-Ressourcen-URI, normalerweise 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

Die Antwort sieht wie folgt aus:

{
  "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. Auflisten von Anwendungsausführungen im Azure Synapse-Arbeitsbereich

Um eine Liste der Apache Spark-Anwendungen für einen Synapse-Arbeitsbereich zu erhalten, befolgen Sie die Informationen in diesem Dokument: Überwachung: Abrufen einer Spark-Auftragsliste.

3. Erfassen von Apache Spark-Anwendungsmetriken mit der Prometheus-API oder den REST-APIs

Erfassen von Apache Spark-Anwendungsmetriken mit der Prometheus-API

Erfassen Sie die aktuellen Metriken der angegebenen Apache Spark-Anwendung mit der Prometheus-API:

GET https://{endpoint}/livyApi/versions/{livyApiVersion}/sparkpools/{sparkPoolName}/sessions/{sessionId}/applications/{sparkApplicationId}/metrics/executors/prometheus?format=html
Parameter Erforderlich BESCHREIBUNG
endpoint True Der Endpunkt zur Arbeitsbereichsentwicklung, etwa https://myworkspace.dev.azuresynapse.net.
livyApiVersion True Gültige API-Version für die Anforderung, zurzeit „2019-11-01-preview“
sparkPoolName True Name des Spark-Pools
sessionID True Bezeichner für die Sitzung
sparkApplicationId True Spark-Anwendungs-ID

Beispielanforderung:

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

Beispielantwort:

Statuscode: Antwort 200 sieht wie folgt aus:

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
...

Erfassen von Apache Spark-Anwendungsmetriken mit der REST-API

GET https://{endpoint}/livyApi/versions/{livyApiVersion}/sparkpools/{sparkPoolName}/sessions/{sessionId}/applications/{sparkApplicationId}/executors
Parameter Erforderlich BESCHREIBUNG
endpoint True Der Endpunkt zur Arbeitsbereichsentwicklung, etwa https://myworkspace.dev.azuresynapse.net.
livyApiVersion True Gültige API-Version für die Anforderung, zurzeit „2019-11-01-preview“
sparkPoolName True Name des Spark-Pools
sessionID True Bezeichner für die Sitzung
sparkApplicationId True Spark-Anwendungs-ID

Beispiel für eine Anforderung

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

Beispielantwort für Statuscode: 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. Erstellen Ihrer eigenen Diagnose- und Überwachungstools

Die Prometheus-API und die Rest-APIs stellen umfangreiche Metrikdaten zur Ausführung von Apache Spark-Anwendungen bereit. Sie können die anwendungsbezogenen Metrikdaten über die Prometheus-API und die REST-APIs erfassen. Zudem können Sie eigene Diagnose- und Überwachungstools erstellen, die für Ihre Anforderungen optimiert sind.