Enviar trabalhos do Spark no Azure Machine Learning
APLICA-SE A:Extensão de ML da CLI do Azure v2 (atual)SDK do Python azure-ai-ml v2 (atual)
O Azure Machine Learning dá suporte ao envio de trabalhos autônomos de aprendizado de máquina e à criação de pipelines de aprendizado de máquina que envolvem várias etapas de fluxo de trabalho de aprendizado de máquina. O Azure Machine Learning cuida da criação de trabalhos autônomos do Spark e da criação de componentes reutilizáveis do Spark que podem ser usados pelos pipelines do Azure Machine Learning. Neste artigo, você aprenderá a enviar trabalhos do Spark usando:
- Interface do usuário do Estúdio do Azure Machine Learning
- CLI do Azure Machine Learning
- SDK do Azure Machine Learning
Para obter mais informações sobre conceitos do Apache Spark no Azure Machine Learning, confira este recurso.
Pré-requisitos
APLICA-SE A: Extensão de ML da CLI do Azurev2 (atual)
- Uma assinatura do Azure. Caso não tenha uma, crie uma conta gratuita antes de começar.
- Um Workspace do Azure Machine Learning. Confira Criar recursos de workspace.
- Criar uma instância de computação do Azure Machine Learning.
- Instale a CLI do Azure Machine Learning.
- (Opcional): um Pool do Spark do Synapse anexado ao workspace do Azure Machine Learning.
Observação
- Para saber mais sobre o acesso a recursos ao usar a computação do Spark sem servidor do Microsoft Azure Machine Learning e o pool do Synapse Spark anexado, consulte Garantir acesso a recursos para trabalhos do Spark.
- O Azure Machine Learning fornece um pool de cota compartilhada do qual todos os usuários podem acessar a cota de computação para executar testes por um tempo limitado. Quando você usa a computação do Spark sem servidor, o Azure Machine Learning permite que você acesse essa cota compartilhada por um curto período de tempo.
Anexar identidade gerenciada atribuída pelo usuário usando a CLI v2
- Crie um arquivo YAML que define a identidade gerenciada atribuída pelo usuário que deve ser anexada ao workspace:
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>': {}
- Com o parâmetro
--file
, use o arquivo YAML no comandoaz ml workspace update
para anexar a identidade gerenciada atribuída pelo usuário:az ml workspace update --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --name <AML_WORKSPACE_NAME> --file <YAML_FILE_NAME>.yaml
Anexe a identidade gerenciada atribuída pelo usuário usando ARMClient
- Instale o
ARMClient
, uma ferramenta de linha de comando simples que invoca a API do Azure Resource Manager. - Crie um arquivo JSON que define a identidade gerenciada atribuída pelo usuário que deve ser anexada ao workspace:
{ "properties":{ }, "location": "<AZURE_REGION>", "identity":{ "type":"SystemAssigned,UserAssigned", "userAssignedIdentities":{ "/subscriptions/<SUBSCRIPTION_ID/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<AML_USER_MANAGED_ID>": { } } } }
- Para anexar a identidade gerenciada atribuída pelo usuário ao workspace, execute o comando a seguir no prompt do PowerShell ou no prompt de comando.
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'
Observação
- Para garantir a execução bem-sucedida do trabalho do Spark, atribua as funções Colaborador e Colaborador de Dados do Blob de Armazenamento na conta de armazenamento do Azure usada para a entrada e a saída de dados à identidade que está sendo usada pelo trabalho do Spark
- O Acesso à Rede Pública deve ser habilitado no workspace do Azure Synapse para garantir a execução bem-sucedida do trabalho do Spark usando um pool do Spark do Synapse anexado.
- Se um pool anexado do Synapse Spark apontar para um pool do Synapse Spark em um workspace do Azure Synapse que tenha uma rede virtual gerenciada associada, um ponto de extremidade privado gerenciado para a conta de armazenamento deverá ser configurado a fim de garantir o acesso aos dados.
- A computação sem servidor do Spark dá suporte à rede virtual gerenciada do Azure Machine Learning. Se uma rede gerenciada for provisionada para a computação Spark sem servidor, os pontos de extremidade privados correspondentes para a conta de armazenamento também deverão ser provisionados para garantir o acesso aos dados.
Enviar um trabalho autônomo do Spark
Depois que forem feitas as alterações necessárias para a parametrização do script do Python, um script do Python desenvolvido pela estruturação de dados interativa poderá ser usado para enviar um trabalho em lotes, a fim de processar um volume maior de dados. Um trabalho em lotes de estruturação de dados simples pode ser enviado como um trabalho autônomo do Spark.
Um trabalho do Spark exige um script Python que usa argumentos, que podem ser desenvolvidos com a modificação do código Python criado com base na estruturação de dados interativa. Uma amostra de script Python é mostrada aqui.
# 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")
Observação
Este exemplo de código Python usa pyspark.pandas
. Somente a versão 3.2 do runtime do Spark ou posterior dá suporte a isso.
O script acima usa dois argumentos --titanic_data
e --wrangled_data
, que passam o caminho dos dados de entrada e da pasta de saída, respectivamente.
APLICA-SE A: Extensão de ML da CLI do Azurev2 (atual)
Para criar um trabalho, um trabalho autônomo do Spark pode ser definido como um arquivo de especificação YAML, que pode ser usado no comando az ml job create
, com o parâmetro --file
. Defina essas propriedades no arquivo YAML:
Propriedades YAML na especificação de trabalho do Spark
type
é definido comospark
.code
– define o local da pasta que contém o código-fonte e os scripts para esse trabalho.entry
– define o ponto de entrada para o trabalho. Ele deve abordar uma destas propriedades:file
– define o nome do script Python que serve como um ponto de entrada para o trabalho.
py_files
– define uma lista de arquivos.zip
,.egg
ou.py
que serão colocados noPYTHONPATH
, para obter a execução bem-sucedida do trabalho. Essa propriedade é opcional.jars
– define uma lista de arquivos.jar
a serem incluídos no driver do Spark e no executorCLASSPATH
para obter a execução bem-sucedida do trabalho. Essa propriedade é opcional.files
– define uma lista de arquivos que devem ser copiados para o diretório de trabalho de cada executor, para obter a execução bem-sucedida do trabalho. Essa propriedade é opcional.archives
– define uma lista de arquivos que devem ser extraídos para o diretório de trabalho de cada executor, para obter a execução bem-sucedida do trabalho. Essa propriedade é opcional.conf
– define estas propriedades de driver e executor do Spark:spark.driver.cores
: o número de núcleos para o driver do Spark.spark.driver.memory
: memória alocada para o driver do Spark, em gigabytes (GB).spark.executor.cores
: o número de núcleos para o executor do Spark.spark.executor.memory
: a alocação de memória para o executor do Spark, em gigabytes (GB).spark.dynamicAllocation.enabled
– se os executores devem ou não ser alocados dinamicamente, como um valorTrue
ouFalse
.- Se a alocação dinâmica de executores estiver habilitada, defina estas propriedades:
spark.dynamicAllocation.minExecutors
– o número mínimo de instâncias de executores do Spark, para alocação dinâmica.spark.dynamicAllocation.maxExecutors
– o número máximo de instâncias de executores do Spark, para alocação dinâmica.
- Se a alocação dinâmica de executores estiver desabilitada, defina esta propriedade:
spark.executor.instances
– o número de instâncias do executor do Spark.
environment
– um ambiente do Azure Machine Learning para executar o trabalho.args
– Os argumentos da linha de comando que devem ser passados para a classe ou o script Python do ponto de entrada do trabalho. Confira o arquivo de especificação YAML fornecido aqui para ver um exemplo.resources
- essa propriedade define os recursos a serem usados por uma computação do Spark sem servidor do Azure Machine Learning. Ela usa as propriedades a seguir:instance_type
– o tipo de instância de computação a ser usado para o Pool do Spark. No momento, há suporte para os seguintes tipos de instância:standard_e4s_v3
standard_e8s_v3
standard_e16s_v3
standard_e32s_v3
standard_e64s_v3
runtime_version
– define a versão de runtime do Spark. Atualmente, há suporte para as seguintes versões de runtime do Spark:3.3
3.4
Importante
Runtime do Azure Synapse para o Apache Spark: Comunicados
- Runtime do Azure Synapse para Apache Spark 3.3:
- Data do Comunicado EOLA: 12 de julho de 2024
- Data do Término do Suporte: 31 de julho de 2025. Após essa data, o runtime será desabilitado.
- Para obter suporte contínuo e desempenho ideal, recomendamos a migração para o Apache Spark 3.4.
- Runtime do Azure Synapse para Apache Spark 3.3:
Este é um exemplo:
resources: instance_type: standard_e8s_v3 runtime_version: "3.4"
compute
– essa propriedade define o nome de um pool do Spark do Synapse anexado, conforme mostrado neste exemplo:compute: mysparkpool
inputs
– essa propriedade define entradas para o trabalho do Spark. As entradas para um trabalho do Spark podem ser um valor literal ou dados armazenados em um arquivo ou pasta.- Um valor literal pode ser um número, um valor booliano ou uma cadeia de caracteres. Alguns exemplos são mostrados aqui:
inputs: sampling_rate: 0.02 # a number hello_number: 42 # an integer hello_string: "Hello world" # a string hello_boolean: True # a boolean value
- Os dados armazenados em um arquivo ou pasta devem ser definidos usando estas propriedades:
type
– defina essa propriedade comouri_file
ouuri_folder
, para dados de entrada presentes em um arquivo ou em uma pasta, respectivamente.path
– o URI dos dados de entrada, comoazureml://
,abfss://
ouwasbs://
.mode
– defina esta propriedade comodirect
. Este exemplo mostra a definição de uma entrada de trabalho, que pode ser chamada de$${inputs.titanic_data}}
:inputs: titanic_data: type: uri_file path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv mode: direct
- Um valor literal pode ser um número, um valor booliano ou uma cadeia de caracteres. Alguns exemplos são mostrados aqui:
outputs
– essa propriedade define as saídas de trabalho do Spark. As saídas de um trabalho do Spark podem ser gravadas em um arquivo ou em um local de pasta, que é definido usando as três propriedades a seguir:type
– essa propriedade pode ser definida comouri_file
ouuri_folder
para gravar dados de saída em um arquivo ou uma pasta, respectivamente.path
– essa propriedade define o URI do local de saída, comoazureml://
,abfss://
ouwasbs://
.mode
– defina esta propriedade comodirect
. Este exemplo mostra a definição de uma saída de trabalho, que pode ser chamada de${{outputs.wrangled_data}}
:outputs: wrangled_data: type: uri_folder path: azureml://datastores/workspaceblobstore/paths/data/wrangled/ mode: direct
identity
– essa propriedade opcional define a identidade usada para enviar esse trabalho. Ela pode ter valoresuser_identity
emanaged
. Se a especificação YAML não definir uma identidade, o trabalho do Spark usará a identidade padrão.
Trabalho autônomo do Spark
Esse exemplo de especificação YAML mostra um trabalho autônomo do Spark. Ele usa uma computação do Spark sem servidor do 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"
Observação
Para usar um pool anexado do Synapse Spark, defina a propriedade compute
no arquivo de especificação YAML de exemplo mostrado acima, em vez da propriedade resources
.
Os arquivos YAML mostrados anteriormente podem ser usados no comando az ml job create
, com o parâmetro --file
, para criar um trabalho autônomo do Spark, conforme mostrado:
az ml job create --file <YAML_SPECIFICATION_FILE_NAME>.yaml --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --workspace-name <AML_WORKSPACE_NAME>
Você pode executar o comando acima no:
- terminal de uma instância de computação do Azure Machine Learning.
- terminal de Visual Studio Code conectado a uma instância de computação do Azure Machine Learning.
- seu computador local que tem a CLI do Azure Machine Learning instalada.
Componente do Spark em um trabalho de pipeline
Um componente do Spark oferece a flexibilidade de usar o mesmo componente em vários pipelines do Azure Machine Learning, como uma etapa de pipeline.
APLICA-SE A: Extensão de ML da CLI do Azurev2 (atual)
A sintaxe YAML para um componente do Spark é semelhante à sintaxe YAML para especificação de trabalho do Spark em muitos aspectos. Essas propriedades são definidas de forma diferente na especificação YAML de componente do Spark:
name
– o nome do componente do Spark.version
– a versão do componente do Spark.display_name
– o nome do componente do Spark a ser exibido na interface do usuário e em outro lugar.description
– a descrição do componente do Spark.inputs
– Essa propriedade é semelhante à propriedadeinputs
descrita na sintaxe do YAML para a especificação de trabalho do Spark, com a exceção de que ela não define a propriedadepath
. Este snippet de código mostra um exemplo da propriedadeinputs
do componente do Spark:inputs: titanic_data: type: uri_file mode: direct
outputs
– Essa propriedade é semelhante à propriedadeoutputs
descrita na sintaxe do YAML para a especificação de trabalho do Spark, com a exceção de que ela não define a propriedadepath
. Este snippet de código mostra um exemplo da propriedadeoutputs
do componente do Spark:outputs: wrangled_data: type: uri_folder mode: direct
Observação
Um componente do Spark não define propriedadesidentity
, compute
ou resources
. O arquivo de especificação YAML do pipeline define essas propriedades.
Este arquivo de especificação YAML fornece um exemplo de um componente do Spark:
$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
O componente do Spark definido no arquivo de especificação YAML mencionado pode ser usado em um trabalho de pipeline do Azure Machine Learning. Consulte esquema YAML do trabalho de pipeline para saber mais sobre a sintaxe YAML que define um trabalho de pipeline. Esse exemplo mostra um arquivo de especificação YAML para um trabalho de pipeline, com um componente Spark e uma computação Spark sem servidor do 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"
Observação
Para usar um pool anexado do Synapse Spark, defina a propriedade compute
no exemplo de arquivo de especificação YAML mostrado acima em vez da propriedade resources
.
O arquivo de especificação YAML mencionado pode ser usado no comando az ml job create
com o parâmetro --file
para criar um trabalho de pipeline, conforme mostrado:
az ml job create --file <YAML_SPECIFICATION_FILE_NAME>.yaml --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --workspace-name <AML_WORKSPACE_NAME>
Você pode executar o comando acima no:
- terminal de uma instância de computação do Azure Machine Learning.
- terminal de Visual Studio Code conectado a uma instância de computação do Azure Machine Learning.
- seu computador local que tem a CLI do Azure Machine Learning instalada.
Solução de problemas de trabalhos do Spark
Para solucionar problemas de um trabalho do Spark, você pode acessar os logs gerados para o respectivo trabalho no Estúdio do Azure Machine Learning. Para exibir os logs de um trabalho do Spark:
- Navegue até Trabalhos no painel esquerdo na interface do usuário do Estúdio do Azure Machine Learning
- Selecione a guia Todos os trabalhos
- Selecione o valor Nome de exibição para o trabalho
- Na página de detalhes do trabalho, selecione a guia Saída + logs
- No explorador de arquivos, expanda a pasta logs e em seguida expanda a pasta azureml
- Acessar os logs de trabalho do Spark dentro das pastas do driver e gerenciador de biblioteca
Observação
Para solucionar problemas de trabalhos do Spark criados durante a estruturação interativa de dados em uma sessão de notebook, selecione Detalhes do trabalho no canto superior direito da interface do usuário do notebook. Um trabalho do Spark de uma sessão interativa de notebook é criado sob o nome de experimento notebook-runs.