Ü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ÜR Azure CLI-ML-Erweiterung v2 (aktuell)
- Ein Azure-Abonnement: Sollten Sie über kein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
- Ein Azure Machine Learning-Arbeitsbereich. Siehe Erstellen von Arbeitsbereichsressourcen.
- Erstellen einer Compute-Instanz von Azure Machine Learning
- Installieren Sie die Azure Machine Learning-CLI.
- (Optional): Ein angefügter Synapse Spark-Pool im Azure Machine Learning-Arbeitsbereich.
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
- 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>': {}
- 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
- Installieren Sie
ARMClient
, ein einfaches Befehlszeilentool, das die Azure Resource Manager-API aufruft. - 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>": { } } } }
- 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
- Um eine erfolgreiche Ausführung des Spark-Auftrags sicherzustellen, weisen Sie der Identität, die für den Spark-Auftrag verwendet wird, die Rollen Mitwirkender und Mitwirkender für Speicherblobdaten für das Azure-Speicherkonto zu, das für die Dateneingabe und -ausgabe verwendet wird.
- Der öffentliche Netzwerkzugriff muss im Azure Synapse-Arbeitsbereich aktiviert sein, um eine erfolgreiche Ausführung des Spark-Auftrags mithilfe eines angefügten Synapse Spark-Pools sicherzustellen.
- Wenn ein angefügter Synapse Spark-Pool auf einen Synapse Spark-Pool in einem Azure Synapse-Arbeitsbereich verweist, dem ein verwaltetes virtuelles Netzwerk zugeordnet ist, sollte ein verwalteter privater Endpunkt für das Speicherkonto konfiguriert werden, um den Zugriff auf die Daten sicherzustellen.
- Serverlose Spark-Computevorgänge unterstützen ein verwaltetes virtuelles Netzwerk für Azure Machine Learning. Wenn ein verwaltetes Netzwerk für die serverlose Spark-Compute-Instanz bereitgestellt wird, sollten auch die entsprechenden privaten Endpunkte für das Speicherkonto bereitgestellt werden, um den Datenzugriff sicherzustellen.
Ü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ÜR Azure 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 aufspark
.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 inPYTHONPATH
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 ExecutorCLASSPATH
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 WertTrue
oderFalse
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.3
3.4
Wichtig
Azure Synapse-Runtime für Apache Spark: Ankündigungen
- Azure Synapse Runtime for Apache Spark 3.3:
- EOLA-Ankündigungsdatum: 12. Juli 2024
- Datum für Supportende: 31. März 2025. 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.4.
- Azure Synapse Runtime for Apache Spark 3.3:
Hier ein Beispiel:
resources: instance_type: standard_e8s_v3 runtime_version: "3.4"
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, aufuri_file
oderuri_folder
fest.path
– der URI der Eingabedaten, z. B.azureml://
,abfss://
oderwasbs://
.mode
– legen Sie diese Eigenschaft aufdirect
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
- Ein Literalwert kann eine Zahl, ein boolescher Wert oder eine Zeichenfolge sein. Einige Beispiele sind hier dargestellt:
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 aufuri_file
oderuri_folder
festgelegt werden, um Ausgabedaten in eine Datei oder einen Ordner zu schreiben.path
– diese Eigenschaft definiert den Ausgabespeicherort-URI, z. B.azureml://
,abfss://
oderwasbs://
.mode
– legen Sie diese Eigenschaft aufdirect
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 Werteuser_identity
undmanaged
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.4"
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ÜR Azure 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 Eigenschaftinputs
, die in der YAML-Syntax für die Spark-Auftragsspezifikation beschrieben wird, mit der Ausnahme, dass sie die Eigenschaftpath
nicht definiert. Dieser Codeausschnitt zeigt ein Beispiel für die Spark-Komponenteneigenschaftinputs
:inputs: titanic_data: type: uri_file mode: direct
outputs
: Diese Eigenschaft ähnelt der Eigenschaftoutputs
, die in der YAML-Syntax für die Spark-Auftragsspezifikation beschrieben wird, mit der Ausnahme, dass sie die Eigenschaftpath
nicht definiert. Dieser Codeausschnitt zeigt ein Beispiel für die Spark-Komponenteneigenschaftoutputs
: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.4"
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
- Navigieren Sie im linken Bereich auf der Azure Machine Learning Studio-Benutzeroberfläche zu Aufträge.
- Wählen Sie die Registerkarte Alle Aufträge aus.
- Wählen Sie den Wert Anzeigename für den Auftrag aus.
- Wählen Sie auf der Auftragsdetailseite die Registerkarte Ausgabe + Protokolle aus.
- Erweitern Sie im Datei-Explorer den Ordner logs, und erweitern Sie dann den Ordner azureml.
- 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.