Condividi tramite


Raccogliere le metriche delle applicazioni Apache Spark tramite API

Panoramica

In questa esercitazione si apprenderà come integrare il server Prometheus locale esistente con l'area di lavoro di Azure Synapse per le metriche dell'applicazione Apache Spark quasi in tempo reale usando il connettore Synapse Prometheus.

Questa esercitazione presenta anche le API delle metriche REST di Azure Synapse. È possibile recuperare i dati delle metriche dell'applicazione Apache Spark tramite le API REST per creare un toolkit di monitoraggio e diagnosi personalizzato o eseguire l’integrazione con i sistemi di monitoraggio.

Usare il connettore Prometheus di Azure Synapse per i server Prometheus locali

Il connettore Prometheus di Azure Synapse è un progetto open source. Il connettore Prometheus di Synapse usa un metodo di individuazione dei servizi basato su file per consentire di:

  • Eseguire l'autenticazione nell'area di lavoro di Synapse tramite un'entità servizio Microsoft Entra.
  • Recuperare l'elenco delle applicazioni Apache Spark nell'area di lavoro.
  • Eseguire il pull delle metriche dell'applicazione Apache Spark tramite la configurazione basata su file Prometheus.

1. Prerequisito

È necessario avere un server Prometheus distribuito in una VM Linux.

2. Creare un'entità servizio

Per usare il connettore Prometheus di Azure Synapse nel server Prometheus locale, seguire questa procedura per creare un'entità servizio.

2.1 Creare un'entità servizio:

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

Il risultato dovrebbe avere l'aspetto seguente:

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

Prendere nota dell'ID app, della password e dell'ID tenant.

2.2 Aggiungere le autorizzazioni corrispondenti all'entità servizio creata nel passaggio precedente.

screenshot grant permission srbac

  1. Accedere all'area di lavoro di Azure Synapse Analytics come amministratore di Synapse

  2. Nel riquadro sinistro di Synapse Studio selezionare Gestisci >Controllo di accesso

  3. Fare clic sul pulsante Aggiungi in alto a sinistra per aggiungere un'assegnazione di ruolo

  4. Per Ambito scegliere Area di lavoro

  5. Per Ruolo scegliere Operatore di calcolo Synapse

  6. Per Selezionare l'utente immettere il <service_principal_name> e fare clic sull'entità servizio

  7. Fare clic su Applica (attendere 3 minuti per rendere effettiva l'autorizzazione).

3. Scaricare il connettore Prometheus di Azure Synapse

Usare i comandi per installare il connettore Prometheus di Azure Synapse.

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. Creare un file di configurazione per le aree di lavoro di Azure Synapse

Creare un file config.yaml nella cartella config e compilare i campi seguenti: workspace_name, tenant_id, service_principal_name e service_principal_password. È possibile aggiungere più aree di lavoro nella configurazione 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. Aggiornare la configurazione di Prometheus

Aggiungere la sezione config seguente nella scrape_config Prometheus e sostituire il <your_workspace_name> con il nome dell'area di lavoro e il <path_to_synapse_connector> con la cartella clonata 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. Avviare il connettore nella VM del server Prometheus

Avviare un server connettore nella VM del server Prometheus come indicato di seguito.

python main.py

Attendere alcuni secondi perché il connettore inizi a funzionare. È anche possibile visualizzare "synapse-prometheus-connector" nella pagina di individuazione del servizio Prometheus.

Usare le API di metriche REST o Prometheus di Azure Synapse per raccogliere i dati delle metriche

1. Authentication

È possibile usare il flusso delle credenziali client per ottenere un token di accesso. Per accedere all'API delle metriche, è necessario ottenere un token di accesso Microsoft Entra per l'entità servizio, che dispone dell'autorizzazione appropriata per accedere alle API.

Parametro Richiesto Descrizione
tenant_id Vero L’ID tenant (applicazione) dell’entità servizio di Azure
grant_type Vero Specifica il tipo di concessione richiesto. In un flusso di concessione delle credenziali client il valore deve essere client_credentials.
client_id Vero L’ID applicazione (entità servizio) dell'applicazione registrata nel portale di Azure o nell'interfaccia della riga di comando di Azure.
client_secret Vero Il segreto generato per l'applicazione (entità servizio)
resource Vero L'URI della risorsa Synapse deve essere '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

La risposta ha un aspetto simile al seguente:

{
  "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. Elencare le applicazioni in esecuzione nell'area di lavoro di Azure Synapse

Per ottenere l'elenco delle applicazioni Apache Spark per un'area di lavoro di Synapse, è possibile seguire questo documento Monitoraggio - Ottenere l'elenco dei processi Apache Spark.

3. Raccogliere le metriche dell'applicazione Apache Spark con le API REST o Prometheus

Raccogliere le metriche dell'applicazione Apache Spark con l'API Prometheus

Ottenere le metriche più recenti dell'applicazione Apache Spark specificata dall'API Prometheus

GET https://{endpoint}/livyApi/versions/{livyApiVersion}/sparkpools/{sparkPoolName}/sessions/{sessionId}/applications/{sparkApplicationId}/metrics/executors/prometheus?format=html
Parametro Richiesto Descrizione
endpoint Vero Endpoint di sviluppo dell'area di lavoro, ad esempio https://myworkspace.dev.azuresynapse.net.
livyApiVersion Vero Versione api valida per la richiesta. Attualmente, è 2019-11-01-preview
sparkPoolName Vero Nome del pool di spark.
sessionId Vero Identificatore della sessione.
sparkApplicationId Vero ID applicazione Spark

Richiesta di esempio:

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

Risposta di esempio:

Codice di stato: la risposta 200 è simile alla seguente:

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

Raccogliere le metriche dell'applicazione Apache Spark con l'API REST

GET https://{endpoint}/livyApi/versions/{livyApiVersion}/sparkpools/{sparkPoolName}/sessions/{sessionId}/applications/{sparkApplicationId}/executors
Parametro Richiesto Descrizione
endpoint Vero Endpoint di sviluppo dell'area di lavoro, ad esempio https://myworkspace.dev.azuresynapse.net.
livyApiVersion Vero Versione api valida per la richiesta. Attualmente, è 2019-11-01-preview
sparkPoolName Vero Nome del pool di spark.
sessionId Vero Identificatore della sessione.
sparkApplicationId Vero ID applicazione Spark

Richiesta di esempio

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

Esempio di codice di stato della risposta: 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. Creare strumenti di diagnostica e monitoraggio personalizzati

L'API Prometheus e le API REST forniscono dati avanzati sulle metriche dell'applicazione Apache Spark che esegue informazioni. È possibile raccogliere i dati sulle metriche correlate all'applicazione tramite l'API Prometheus e le API REST. E creare strumenti di diagnostica e monitoraggio personalizzati più adatti alle proprie esigenze.