在 Azure Machine Learning 中提交 Spark 作業

適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)

Azure Machine Learning 支援提交獨立機器學習作業,以及建立包含多個機器學習工作流程步驟的機器學習管線 (機器翻譯)。 Azure Machine Learning 可處理的建立目標,包含獨立 Spark 作業,以及可在 Azure Machine Learning 管線中使用的可重複使用 Spark 元件。 在本文中,您會了解如何使用下列項目提交 Spark 作業:

  • Azure Machine Learning 工作室 UI
  • Azure Machine Learning CLI
  • Azure Machine Learning SDK

如需了解 Azure Machine Learning 中的 Apache Spark,請參閱這項資源 (機器翻譯)。

必要條件

適用於:Azure CLI ml 延伸模組 v2 (目前)

注意

  • 若想進一步了解如何在使用 Azure Machine Learning 無伺服器 Spark 計算和連結 Synapse Spark 集區時存取資源,請參閱確保 Spark 作業的資源存取
  • Azure Machine Learning 提供共用配額集區,供所有使用者存取計算配額,以便在有限時間內執行測試。 當您使用無伺服器 Spark 計算時,Azure Machine Learning 可讓您短暫存取此共用配額。

使用 CLI 第 2 版連結使用者指派的受控識別

  1. 建立 YAML 檔案,定義應連結至工作區的使用者指派受控識別:
    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. --file 參數中,使用 az ml workspace update 命令中的 YAML 檔案連結使用者指派的受控識別:
    az ml workspace update --subscription <SUBSCRIPTION_ID> --resource-group <RESOURCE_GROUP> --name <AML_WORKSPACE_NAME> --file <YAML_FILE_NAME>.yaml
    

使用 ARMClient 連結使用者指派的受控識別

  1. 安裝 ARMClient,這是一個簡單的命令列工具,可叫用 Azure Resource Manager API。
  2. 建立 JSON 檔案,定義應連結至工作區的使用者指派受控識別:
    {
        "properties":{
        },
        "location": "<AZURE_REGION>",
        "identity":{
            "type":"SystemAssigned,UserAssigned",
            "userAssignedIdentities":{
                "/subscriptions/<SUBSCRIPTION_ID/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<AML_USER_MANAGED_ID>": { }
            }
        }
    }
    
  3. 在 PowerShell 提示或命令提示字元中執行下列命令,將使用者指派的受控識別連結至工作區。
    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'
    

注意

提交獨立 Spark 作業

對 Python 指令碼參數化進行必要變更後,由互動式資料整頓所開發的 Python 指令碼就可以用於提交批次工作,以處理較大的資料量。 簡單的資料整頓批次作業可以提交為獨立 Spark 作業。

Spark 作業需要使用採用引數的 Python 指令碼;藉由修改從互動式資料整頓開發的 Python 程式碼,即可開發出這類指令碼。 這裡會顯示範例 Python 指令碼。

# 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")

注意

此 Python 程式碼範例會使用 pyspark.pandas。 只有 Spark 執行階段 3.2 版或更新版本才支援此功能。

上述指令碼會採用兩個引數 --titanic_data--wrangled_data,分別傳遞輸入資料和輸出資料夾的路徑。

適用於:Azure CLI ml 延伸模組 v2 (目前)

獨立 Spark 作業可以定義為 YAML 規格檔案,該檔案可用於 az ml job create 命令中,搭配 --file 參數來建立作業。 在 YAML 檔案中定義這些屬性:

Spark 作業規格中的 YAML 屬性

  • type - 設定為 spark

  • code - 定義包含此作業的原始程式碼和指令碼的資料夾位置。

  • entry - 定義作業的進入點。 應該涵蓋下列其中一個屬性:

    • file - 定義 Python 指令碼的名稱,作為作業的進入點。
  • py_files - 定義 .zip.egg.py 檔案的清單,放置在 PYTHONPATH 中以便成功執行作業。 這個屬性為選擇性。

  • jars - 定義要包含在 Spark 驅動程式上的 .jar 檔案清單,以及執行程式 CLASSPATH,以成功執行作業。 這個屬性為選擇性。

  • files - 定義應該複製到每個執行程式工作目錄的檔案清單,以成功執行作業。 這個屬性為選擇性。

  • archives - 定義應該擷取到每個執行程式工作目錄的封存清單,以成功執行作業。 這個屬性為選擇性。

  • conf - 定義這些 Spark 驅動程式和執行程式屬性:

    • spark.driver.cores:Spark 驅動程式的核心數目。
    • spark.driver.memory:為 Spark 驅動程式配置的記憶體,以 GB 為單位。
    • spark.executor.cores:Spark 執行程式的核心數目。
    • spark.executor.memory:Spark 執行程式的記憶體配置,以 GB 為單位。
    • spark.dynamicAllocation.enabled - 執行程式是否應該以動態方式配置,值為 TrueFalse
    • 如果啟用執行程式的動態配置,請定義下列屬性:
      • spark.dynamicAllocation.minExecutors - 動態配置的 Spark 執行程式執行個體數目下限。
      • spark.dynamicAllocation.maxExecutors - 動態配置的 Spark 執行程式執行個體數目上限。
    • 如果停用執行程式的動態配置,請定義此屬性:
      • spark.executor.instances - Spark 執行程式執行個體的數目。
  • environment - 用來執行作業的 Azure Machine Learning 環境

  • args - 應該傳遞至作業進入點 Python 指令碼的命令列引數。 如需範例,請參閱此處提供的 YAML 規格檔案。

  • resources - 此屬性會定義 Azure Machine Learning 無伺服器 Spark 計算要使用的資源。 其會使用下列屬性:

    • instance_type - 要用於 Spark 集區的計算執行個體類型。 目前支援下列執行個體類型:
      • standard_e4s_v3
      • standard_e8s_v3
      • standard_e16s_v3
      • standard_e32s_v3
      • standard_e64s_v3
    • runtime_version - 定義 Spark 執行階段版本。 目前支援下列 Spark 執行階段版本:
      • 3.2
      • 3.3

        重要

        適用於 Apache Spark 的 Azure Synapse Analytics 執行階段:公告

        • 適用於 Apache Spark 3.2 的 Azure Synapse Analytics 執行階段:
          • EOLA 公告日期:2023 年 7 月 8 日
          • 支援結束日期:2024 年 7 月 8 日。 在此日期之後,此執行階段將停用。
        • 若想持續獲得支援和最佳效能,建議您移轉到 Apache Spark 3.3。

    這是一個範例:

    resources:
      instance_type: standard_e8s_v3
      runtime_version: "3.3"
    
  • compute - 此屬性會定義連結 Synapse Spark 集區的名稱,如下列範例所示:

    compute: mysparkpool
    
  • inputs - 此屬性會定義 Spark 作業的輸入。 Spark 作業的輸入可以是常值,或是儲存在檔案或資料夾中的資料。

    • 常值可以是數字、布林值或字串。 一些範例如下所示:
      inputs:
        sampling_rate: 0.02 # a number
        hello_number: 42 # an integer
        hello_string: "Hello world" # a string
        hello_boolean: True # a boolean value
      
    • 儲存在檔案或資料夾中的資料應該使用下列屬性來定義:
      • type - 將此屬性設定為 uri_fileuri_folder,分別用於檔案或資料夾中包含的輸入資料。
      • path - 輸入資料的 URI,例如 azureml://abfss://wasbs://
      • mode - 將此屬性設定為 direct。 此範例顯示作業輸入的定義,稱為 $${inputs.titanic_data}}
        inputs:
          titanic_data:
            type: uri_file
            path: azureml://datastores/workspaceblobstore/paths/data/titanic.csv
            mode: direct
        
  • outputs - 此屬性會定義 Spark 作業輸出。 Spark 作業的輸出可以寫入檔案或資料夾位置,此位置是使用下列三個屬性定義的:

    • type - 這個屬性可以設定為 uri_fileuri_folder,分別將輸出資料寫入檔案或資料夾。
    • path - 這個屬性會定義輸出位置 URI,例如 azureml://abfss://wasbs://
    • mode - 將此屬性設定為 direct。 此範例顯示作業輸出定義,稱為 ${{outputs.wrangled_data}}
      outputs:
        wrangled_data:
          type: uri_folder
          path: azureml://datastores/workspaceblobstore/paths/data/wrangled/
          mode: direct
      
  • identity - 這個選擇性屬性會定義用來提交此作業的身分識別。 可以有 user_identitymanaged 值。 如果 YAML 規格未定義身分識別,則 Spark 作業會使用預設身分識別。

獨立 Spark 作業

此範例 YAML 規格會顯示獨立 Spark 作業。 此作業使用 Azure Machine Learning 無伺服器 Spark 計算:

$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"

注意

若要使用連結的 Synapse Spark 集區,請定義上述範例 YAML 規格檔案中的 compute 屬性,而不是 resources 屬性。

上述 YAML 檔案可以搭配 --file 參數在 az ml job create 命令中使用,以建立獨立 Spark 作業,如下所示:

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

您可以在下列位置執行上述命令:

管線作業中的 Spark 元件

Spark 元件可讓您彈性地在多個 Azure Machine Learning 管線中使用相同的元件作為管線步驟。

適用於:Azure CLI ml 延伸模組 v2 (目前)

Spark 元件的 YAML 語法與 Spark 作業規格的 YAML 語法 (機器翻譯) 大致類似。 這些屬性在 Spark 元件 YAML 規格中會以不同的方式定義:

  • name - Spark 元件的名稱。

  • version - Spark 元件的版本。

  • display_name - 要在 UI 和其他位置顯示的 Spark 元件名稱。

  • description - Spark 元件的描述。

  • inputs - 此屬性類似於 Spark 作業規格中的 YAML 語法 (機器翻譯) 中描述的 inputs 屬性,不同之處在於其未定義 path 屬性。 此程式碼片段顯示 Spark 元件 inputs 屬性的範例:

    inputs:
      titanic_data:
        type: uri_file
        mode: direct
    
  • outputs - 此屬性類似於 Spark 作業規格中的 YAML 語法 (機器翻譯) 中描述的 outputs 屬性,不同之處在於其未定義 path 屬性。 此程式碼片段顯示 Spark 元件 outputs 屬性的範例:

    outputs:
      wrangled_data:
        type: uri_folder
        mode: direct
    

注意

Spark 元件不會定義 identitycomputeresources 屬性。 管線 YAML 規格檔案為這些屬性提供了定義。

此 YAML 規格檔案提供 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

上述 YAML 規格檔案中定義的 Spark 元件可用於 Azure Machine Learning 管線作業。 若要深入了解定義管線作業的 YAML 語法,請參閱管線作業 YAML 結構描述。 此範例顯示管線作業的 YAML 規格檔案、Spark 元件,以及 Azure Machine Learning 無伺服器 Spark 計算:

$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"

注意

若要使用連結的 Synapse Spark 集區,請定義上述範例 YAML 規格檔案中的 compute 屬性,而不是 resources 屬性。

上述 YAML 規格檔案可用於 az ml job create 命令,使用 --file 參數建立管線作業,如下所示:

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

您可以在下列位置執行上述命令:

對 Spark 作業進行疑難排解

若要對 Spark 作業進行疑難排解,您可以在 Azure Machine Learning 工作室中存取為該作業產生的記錄。 如何檢視 Spark 作業的記錄:

  1. 從 Azure Machine Learning 工作室 UI 的左側面板,瀏覽至 [作業]
  2. 選取 [所有作業] 索引標籤
  3. 選取作業的 [顯示名稱]
  4. 在 [作業詳細資料] 頁面上,選取 [輸出 + 記錄] 索引標籤
  5. 在檔案總管中,依序展開 [logs] 資料夾與 [azureml] 資料夾
  6. 存取 [驅動程式] 與 [程式庫管理員] 資料夾中的 Spark 作業記錄

注意

若要針對在筆記本工作階段中的互動式資料整頓期間所建立的 Spark 作業,進行疑難排解,請選取筆記本 UI 右上角的 [作業詳細資料]。 互動式筆記本工作階段中的 Spark 作業建立時,會採用實驗名稱 notebook-runs

下一步