Übermitteln von Spark-Aufträgen in Azure Machine Learning

GILT FÜR:Azure CLI ML-Erweiterung v2 (aktuell)Python SDK azure-ai-ml v2 (aktuell)

Azure Machine Learning unterstützt die Übermittlung eigenständiger Aufträge für maschinelles Lernen und die Erstellung von Pipelines für maschinelles Lernen, die mehrere Schritte in Workflows für maschinelles Lernen umfassen. Azure Machine Learning übernimmt sowohl die Erstellung von eigenständigen Spark-Aufträgen als auch die Erstellung wiederverwendbarer Spark-Komponenten, die von Azure Machine Learning-Pipelines verwendet werden können. In diesem Artikel erfahren Sie, wie Sie Spark-Aufträge mithilfe dieser Voraussetzungen übermitteln:

  • Benutzeroberfläche von Azure Machine Learning Studio
  • Azure Machine Learning-CLI
  • Azure Machine Learning SDK

Weitere Informationen zu Apache Spark in Azure Machine Learning-Konzepten finden Sie in dieser Ressource.

Voraussetzungen

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Hinweis

  • Weitere Informationen zum Ressourcenzugriff bei Verwendung der serverlosen Spark-Compute von Azure Machine Learning und angefügtem Synapse Spark-Pool finden Sie unter Sicherstellen des Ressourcenzugriffs für Spark-Aufträge.
  • Azure Machine Learning bietet einen freigegebenen Kontingentpool, aus dem alle Benutzer auf das Computekontingent zugreifen können, um Tests für einen begrenzten Zeitraum durchzuführen. Wenn Sie die serverlose Spark-Computing verwenden, können Sie mit Azure Machine Learning für kurze Zeit auf dieses freigegebene Kontingent zugreifen.

Anfügen einer benutzerseitig zugewiesenen verwalteten Identität mithilfe von CLI v2

  1. Erstellen Sie eine YAML-Datei, die die benutzerseitig zugewiesene verwaltete Identität definiert, die an den Arbeitsbereich angefügt werden soll:
    identity:
      type: system_assigned,user_assigned
      tenant_id: <TENANT_ID>
      user_assigned_identities:
        '/subscriptions/<SUBSCRIPTION_ID/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<AML_USER_MANAGED_ID>':
          {}
    
  2. Verwenden Sie die YAML-Datei im az ml workspace update-Befehl mit dem --file-Parameter, um die vom Benutzer zugewiesene verwaltete Identität anzufügen:
    az ml workspace update --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --name <AML_WORKSPACE_NAME> --file <YAML_FILE_NAME>.yaml
    

Anfügen einer benutzerseitig zugewiesenen verwalteten Identität mithilfe von ARMClient

  1. Installieren Sie ARMClient, ein einfaches Befehlszeilentool, das die Azure Resource Manager-API aufruft.
  2. Erstellen Sie eine JSON-Datei, die die benutzerseitig zugewiesene verwaltete Identität definiert, die an den Arbeitsbereich angefügt werden soll:
    {
        "properties":{
        },
        "location": "<AZURE_REGION>",
        "identity":{
            "type":"SystemAssigned,UserAssigned",
            "userAssignedIdentities":{
                "/subscriptions/<SUBSCRIPTION_ID/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<AML_USER_MANAGED_ID>": { }
            }
        }
    }
    
  3. Führen Sie den folgenden Befehl an der PowerShell-Eingabeaufforderung oder der Eingabeaufforderung aus, um die vom Benutzer zugewiesene verwaltete Identität an den Arbeitsbereich anzufügen.
    armclient PATCH https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.MachineLearningServices/workspaces/<AML_WORKSPACE_NAME>?api-version=2022-05-01 '@<JSON_FILE_NAME>.json'
    

Hinweis

Übermitteln eines eigenständigen Spark-Auftrags

Ein durch interaktives Data Wrangling entwickeltes Python-Skript kann zum Übermitteln eines Batchauftrags verwendet werden, um eine größere Menge von Daten zu verarbeiten, nachdem die erforderlichen Änderungen an der Parametrisierung des Python-Skripts vorgenommen wurden. Ein einfacher Data Wrangling-Batchauftrag kann als eigenständiger Spark-Job übermittelt werden.

Ein Spark-Auftrag erfordert ein Python-Skript, das Argumente akzeptiert und durch Modifikation des Python-Codes entwickelt werden kann, der aus interaktivem Data Wrangling entwickelt wurde. Ein Python-Beispielskript wird hier gezeigt.

# titanic.py
import argparse
from operator import add
import pyspark.pandas as pd
from pyspark.ml.feature import Imputer

parser = argparse.ArgumentParser()
parser.add_argument("--titanic_data")
parser.add_argument("--wrangled_data")

args = parser.parse_args()
print(args.wrangled_data)
print(args.titanic_data)

df = pd.read_csv(args.titanic_data, index_col="PassengerId")
imputer = Imputer(inputCols=["Age"], outputCol="Age").setStrategy(
    "mean"
)  # Replace missing values in Age column with the mean value
df.fillna(
    value={"Cabin": "None"}, inplace=True
)  # Fill Cabin column with value "None" if missing
df.dropna(inplace=True)  # Drop the rows which still have any missing value
df.to_csv(args.wrangled_data, index_col="PassengerId")

Hinweis

Dieses Python-Codebeispiel verwendet pyspark.pandas. Dies wird nur von der Spark-Laufzeitversion 3.2 oder höher unterstützt.

Das obige Skript akzeptiert zwei Argumente --titanic_data und --wrangled_data, die den Pfad der Eingabedaten bzw. des Ausgabeordners übergeben.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Zum Erstellen eines Auftrags kann ein eigenständiger Spark-Auftrag als YAML-Spezifikationsdatei definiert werden, die im Befehl az ml job create mit dem Parameter --file verwendet werden kann. Definieren Sie diese Eigenschaften in der YAML-Datei:

YAML-Eigenschaften in der Spark-Auftragsspezifikation

  • type – festgelegt auf spark.

  • code – definiert den Speicherort des Ordners, der Quellcode und Skripte für diesen Job enthält.

  • entry – definiert den Einstiegspunkt für den Auftrag. Es sollte eine der folgenden Eigenschaften abdecken:

    • file – definiert den Namen des Python-Skripts, das als Einstiegspunkt für den Auftrag dient.
  • py_files – definiert eine Liste von den Dateien .zip, .egg, oder .py, die für die erfolgreiche Ausführung des Auftrags in PYTHONPATH platziert werden sollen. Diese Eigenschaft ist optional.

  • jars – definiert eine Liste der Dateien .jar, die für die erfolgreiche Ausführung des Auftrags in den Spark-Treiber und den Executor CLASSPATH eingeschlossen werden sollen. Diese Eigenschaft ist optional.

  • files – definiert eine Liste der Dateien, die für die erfolgreiche Auftragsausführung in das Arbeitsverzeichnis jedes Executors kopiert werden sollen. Diese Eigenschaft ist optional.

  • archives – definiert eine Liste der Archive, die für die erfolgreiche Auftragsausführung in das Arbeitsverzeichnis jedes Executors extrahiert werden sollen. Diese Eigenschaft ist optional.

  • conf – definiert die folgenden Spark-Treiber- und Executor-Eigenschaften:

    • spark.driver.cores: die Anzahl der Kerne für den Spark-Treiber.
    • spark.driver.memory: zugewiesener Arbeitsspeicher für den Spark-Treiber in Gigabyte (GB).
    • spark.executor.cores: die Anzahl der Kerne für den Spark-Treiber.
    • spark.executor.memory: die Speicherbelegung für den Spark-Executor in Gigabyte (GB).
    • spark.dynamicAllocation.enabled – gibt an, ob Executors dynamisch als Wert True oder False zugeordnet werden sollen.
    • Wenn die dynamische Zuordnung von Executors aktiviert ist, definieren Sie die folgenden Eigenschaften:
      • spark.dynamicAllocation.minExecutors – die Mindestanzahl von Spark-Executors-Instanzen für die dynamische Zuordnung.
      • spark.dynamicAllocation.maxExecutors – die maximale Anzahl von Spark-Executors-Instanzen für die dynamische Zuordnung.
    • Wenn die dynamische Zuordnung von Executors deaktiviert ist, definieren Sie diese Eigenschaft:
      • spark.executor.instances – die Anzahl der Spark-Executor-Instanzen.
  • environment – eine Azure Machine Learning-Umgebung zum Ausführen des Auftrags.

  • args – die Befehlszeilenargumente, die an das Python-Skript des Auftragseinstiegspunkts übergeben werden sollten. Ein Beispiel finden Sie in der hier angegebenen YAML-Spezifikationsdatei.

  • resources – diese Eigenschaft definiert die Ressourcen, die von einer serverlosen Spark-Computeversion (Vorschau) von Azure Machine Learning verwendet werden sollen. Es verfügt über folgende Eigenschaften:

    • instance_type – der Compute-Instanztyp, der für den Spark-Pool verwendet werden soll. Folgende Instanztypen werden derzeit unterstützt:
      • standard_e4s_v3
      • standard_e8s_v3
      • standard_e16s_v3
      • standard_e32s_v3
      • standard_e64s_v3
    • runtime_version – definiert die Spark-Runtimeversion. Die folgenden Spark-Runtimeversionen werden derzeit unterstützt:
      • 3.2
      • 3.3

        Wichtig

        Azure Synapse-Runtime für Apache Spark: Ankündigungen

        • Azure Synapse Runtime for Apache Spark 3.2:
          • EOLA-Datum: 8. Juli 2023
          • Datum für Supportende: 8. Juli 2024. Nach diesem Datum wird die Runtime deaktiviert.
        • Wenn Sie weiterhin Support erhalten und von optimaler Leistung profitieren möchten, empfehlen wir die Migration zu Apache Spark 3.3.

    Hier ein Beispiel:

    resources:
      instance_type: standard_e8s_v3
      runtime_version: "3.3"
    
  • compute – diese Eigenschaft definiert den Namen eines angefügten Synapse Spark-Pools, wie in diesem Beispiel gezeigt:

    compute: mysparkpool
    
  • inputs – diese Eigenschaft definiert Eingaben für den Spark-Auftrag. Eingaben für einen Spark-Auftrag können entweder ein Literalwert oder gespeicherte Daten in einer Datei oder einem Ordner sein.

    • Ein Literalwert kann eine Zahl, ein boolescher Wert oder eine Zeichenfolge sein. Einige Beispiele sind hier dargestellt:
      inputs:
        sampling_rate: 0.02 # a number
        hello_number: 42 # an integer
        hello_string: "Hello world" # a string
        hello_boolean: True # a boolean value
      
    • Gespeicherte Daten in einer Datei oder einem Ordner sollten mithilfe der folgenden Eigenschaften definiert werden:
      • type – legen Sie diese Eigenschaft für Eingabedaten, die in einer Datei oder einem Ordner enthalten sind, auf uri_file oder uri_folder fest.
      • path – der URI der Eingabedaten, z. B. azureml://, abfss:// oder wasbs://.
      • mode – legen Sie diese Eigenschaft auf direct fest. Dieses Beispiel zeigt die Definition einer Auftragseingabe, die als $${inputs.titanic_data}} bezeichnet werden kann:
        inputs:
          titanic_data:
            type: uri_file
            path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv
            mode: direct
        
  • outputs – diese Eigenschaft definiert die Spark-Auftragsausgaben. Ausgaben für einen Spark-Auftrag können in eine Datei oder einen Ordnerspeicherort geschrieben werden, der mit den folgenden drei Eigenschaften definiert wird:

    • type – diese Eigenschaft kann auf uri_file oder uri_folder festgelegt werden, um Ausgabedaten in eine Datei oder einen Ordner zu schreiben.
    • path – diese Eigenschaft definiert den Ausgabespeicherort-URI, z. B. azureml://, abfss:// oder wasbs://.
    • mode – legen Sie diese Eigenschaft auf direct fest. Dieses Beispiel zeigt die Definition einer Auftragsausgabe, die als ${{outputs.wrangled_data}} bezeichnet werden kann:
      outputs:
        wrangled_data:
          type: uri_folder
          path: azureml://datastores/workspaceblobstore/paths/data/wrangled/
          mode: direct
      
  • identity – diese optionale Eigenschaft definiert die Identität, die zum Übermitteln dieses Auftrags verwendet wird. Es kann Werte user_identity und managed aufweisen. Wenn die YAML-Spezifikation keine Identität definiert, verwendet der Spark-Auftrag die Standardidentität.

Eigenständiger Spark-Auftrag

Diese YAML-Beispielspezifikation zeigt einen eigenständigen Spark-Auftrag. Sie verwendet eine serverlose Spark-Computeversion von Azure Machine Learning:

$schema: http://azureml/sdk-2-0/SparkJob.json
type: spark

code: ./ 
entry:
  file: titanic.py

conf:
  spark.driver.cores: 1
  spark.driver.memory: 2g
  spark.executor.cores: 2
  spark.executor.memory: 2g
  spark.executor.instances: 2

inputs:
  titanic_data:
    type: uri_file
    path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv
    mode: direct

outputs:
  wrangled_data:
    type: uri_folder
    path: azureml://datastores/workspaceblobstore/paths/data/wrangled/
    mode: direct

args: >-
  --titanic_data ${{inputs.titanic_data}}
  --wrangled_data ${{outputs.wrangled_data}}

identity:
  type: user_identity

resources:
  instance_type: standard_e4s_v3
  runtime_version: "3.3"

Hinweis

Wenn Sie einen angefügten Synapse Spark-Pool verwenden möchten, definieren Sie im zuvor gezeigten Beispiel einer YAML-Spezifikationsdatei die Eigenschaft compute anstelle der Eigenschaft resources.

Die zuvor gezeigten YAML-Dateien können im Befehl az ml job create mit dem Parameter --file verwendet werden, um einen eigenständigen Spark-Auftrag wie dargestellt zu erstellen:

az ml job create --file <YAML_SPECIFICATION_FILE_NAME>.yaml --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --workspace-name <AML_WORKSPACE_NAME>

Sie können den obigen Befehl an folgenden Stellen ausführen:

Spark-Komponente in einem Pipelineauftrag

Eine Spark-Komponente bietet die Flexibilität, dieselbe Komponente in mehreren Azure Machine Learning-Pipelines als Pipelineschritt zu verwenden.

GILT FÜRAzure CLI ML-Erweiterung v2 (aktuell)

Die YAML-Syntax für eine Spark-Komponente ähnelt in den meisten Fällen der YAML-Syntax für die Spark-Auftragsspezifikation. Diese Eigenschaften werden in der YAML-Spezifikation der Spark-Komponente unterschiedlich definiert:

  • name – der Name der Spark-Komponente.

  • version – die Version der Spark-Komponente.

  • display_name – der Name der Spark-Komponente, die auf der Benutzeroberfläche und an anderer Stelle angezeigt werden soll.

  • description – die Beschreibung der Spark-Komponente.

  • inputs: Diese Eigenschaft ähnelt der Eigenschaft inputs, die in der YAML-Syntax für die Spark-Auftragsspezifikation beschrieben wird, mit der Ausnahme, dass sie die Eigenschaft path nicht definiert. Dieser Codeausschnitt zeigt ein Beispiel für die Spark-Komponenteneigenschaft inputs:

    inputs:
      titanic_data:
        type: uri_file
        mode: direct
    
  • outputs: Diese Eigenschaft ähnelt der Eigenschaft outputs, die in der YAML-Syntax für die Spark-Auftragsspezifikation beschrieben wird, mit der Ausnahme, dass sie die Eigenschaft path nicht definiert. Dieser Codeausschnitt zeigt ein Beispiel für die Spark-Komponenteneigenschaft outputs:

    outputs:
      wrangled_data:
        type: uri_folder
        mode: direct
    

Hinweis

Eine Spark-Komponente definiert nicht die Eigenschaften identity, compute oder resources. Diese Eigenschaften sind in der YAML-Spezifikationsdatei der Pipeline definiert.

Diese YAML-Spezifikationsdatei enthält ein Beispiel für eine Spark-Komponente:

$schema: http://azureml/sdk-2-0/SparkComponent.json
name: titanic_spark_component
type: spark
version: 1
display_name: Titanic-Spark-Component
description: Spark component for Titanic data

code: ./src
entry:
  file: titanic.py

inputs:
  titanic_data:
    type: uri_file
    mode: direct

outputs:
  wrangled_data:
    type: uri_folder
    mode: direct

args: >-
  --titanic_data ${{inputs.titanic_data}}
  --wrangled_data ${{outputs.wrangled_data}}

conf:
  spark.driver.cores: 1
  spark.driver.memory: 2g
  spark.executor.cores: 2
  spark.executor.memory: 2g
  spark.dynamicAllocation.enabled: True
  spark.dynamicAllocation.minExecutors: 1
  spark.dynamicAllocation.maxExecutors: 4

Die in der obigen YAML-Spezifikationsdatei definierte Spark-Komponente kann in einem Azure Machine Learning-Pipelineauftrag verwendet werden. Weitere Informationen zur YAML-Syntax, die einen Pipelineauftrag definiert, finden Sie unter YAML-Schema für Pipelineaufträge. Dieses Beispiel zeigt eine YAML-Spezifikationsdatei für einen Pipelineauftrag mit einer Spark-Komponente und einer serverlosen Spark-Computeversion von Azure Machine Learning:

$schema: http://azureml/sdk-2-0/PipelineJob.json
type: pipeline
display_name: Titanic-Spark-CLI-Pipeline
description: Spark component for Titanic data in Pipeline

jobs:
  spark_job:
    type: spark
    component: ./spark-job-component.yaml
    inputs:
      titanic_data: 
        type: uri_file
        path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv
        mode: direct

    outputs:
      wrangled_data:
        type: uri_folder
        path: azureml://datastores/workspaceblobstore/paths/data/wrangled/
        mode: direct

    identity:
      type: managed

    resources:
      instance_type: standard_e8s_v3
      runtime_version: "3.3"

Hinweis

Wenn Sie einen angefügten Synapse Spark-Pool verwenden möchten, definieren Sie im oben gezeigten Beispiel einer YAML-Spezifikationsdatei die Eigenschaft compute anstelle der Eigenschaft resources.

Die obige YAML-Spezifikationsdatei kann im Befehl az ml job create mithilfe des Befehls --file verwendet werden, um einen Pipelineauftrag wie gezeigt zu erstellen:

az ml job create --file <YAML_SPECIFICATION_FILE_NAME>.yaml --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --workspace-name <AML_WORKSPACE_NAME>

Sie können den obigen Befehl an folgenden Stellen ausführen:

Problembehandlung bei Spark-Aufträgen

Um Probleme mit einem Spark-Auftrag zu behandeln, können Sie auf die Protokolle zugreifen, die für diesen Auftrag in Azure Machine Learning Studio generiert wurden. So zeigen Sie die Protokolle für einen Spark-Auftrag an

  1. Navigieren Sie im linken Bereich auf der Azure Machine Learning Studio-Benutzeroberfläche zu Aufträge.
  2. Wählen Sie die Registerkarte Alle Aufträge aus.
  3. Wählen Sie den Wert Anzeigename für den Auftrag aus.
  4. Wählen Sie auf der Auftragsdetailseite die Registerkarte Ausgabe + Protokolle aus.
  5. Erweitern Sie im Datei-Explorer den Ordner logs, und erweitern Sie dann den Ordner azureml.
  6. Sie können auf die Spark-Auftragsprotokolle in den Ordnern driver und library manager zugreifen.

Hinweis

Um Probleme mit Spark-Aufträgen zu behandeln, die während des interaktiven Data Wrangling in einer Notebooksitzung erstellt wurden, wählen Sie Auftragsdetails in der oberen rechten Ecke der Notebook-Benutzeroberfläche aus. Ein Spark-Auftrag aus einer interaktiven Notebooksitzung wird unter dem Experimentnamen notebook-runs erstellt.

Nächste Schritte