在分散式模式中使用 Map 狀態來協調大規模的 parallel 工作負載 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在分散式模式中使用 Map 狀態來協調大規模的 parallel 工作負載

使用 Step Functions,您可以協調大規模的 parallel 工作負載以執行工作,例如按需處理半結構化資料。這些 parallel 工作負載可讓您同時處理存放在 Amazon S3 中的大規模資料來源。例如,您可以處理包含大量資料的單一 JSON 或 CSV 檔案。或者,您可能會處理大量的 Amazon S3 物件集。

若要在工作流程中設定大規模的 parallel 工作負載,請在「分散式」模式中包含Map狀態。Map 狀態會同時處理資料集中的項目。設置為分佈式的Map狀態稱為分佈式地圖狀態。在分散式模式下,狀Map態允許高並行處理。在「分散式」模式中,Map狀態會以稱為子工作流程執行的版序處理資料集中的項目。您可以指定可以 parallel 執行的子工作流程執行數目。每個子工作流程執行都有自己的執行記錄,與父工作流程的執行歷程記錄不同。如果未指定,「Step Functions」會 parallel 執行 10,000 個 parallel 子工作流程執行。

下圖說明如何在工作流程中設定大規模的 parallel 工作負載。

圖表說明編排大規模 parallel 工作負載的概念。

重要用語

分散式模式

「對應」狀態的處理模式。在此模式下,Map狀態的每個版序都會以啟用高並行性的子工作流程執行方式執行來執行。每個子工作流程執行都有自己的執行歷程記錄,這與父工作流程的執行歷程記錄不同。此模式支援從大規模 Amazon S3 資料來源讀取輸入。

分散式地圖狀態

設定為分散式處理模式的對應狀態。

地圖工作流

Map狀態執行的一組步驟。

父工作流程

包含一或多個分散式地圖狀態的工作流程。

子工作流程執行

分散式貼圖」狀態的版序。子工作流程執行具有自己的執行歷程記錄,與父工作流程的執行歷程記錄不同。

地圖運行

當您在分散式模式下執行Map狀態時,「Step Functions」會建立「對應執行」資源。Map Run 是指分散式地圖狀態啟動的一組子工作流程執行,以及控制這些執行的執行階段設定。Step Functions 將 Amazon 資源名稱(ARN)分配給您的地圖運行。您可以在 Step Functions 控制台中檢查地圖運行。您也可以叫用 DescribeMapRun API 動作。「地圖執行」也會向其發出 CloudWatch度量。

如需詳細資訊,請參閱 檢查地圖運行

分散式對應狀態定義範例

當您需要協調符合下列任何條件組合的大規模 parallel 工作負載時,請使用分散式模式中的Map狀態:

  • 資料集的大小超過 256 KB。

  • 工作流程的執行事件歷程記錄超過 25,000 個項目。

  • 您需要超過 40 個 parallel 迭代的並發性。

下列分散式地圖狀態定義範例會將資料集指定為存放在 Amazon S3 儲存貯體中的 CSV 檔案。它也會指定 Lambda 函數來處理 CSV 檔案每一列中的資料。由於此範例使用 CSV 檔案,因此也會指定 CSV 欄標題的位置。若要檢視此範例的完整狀態機定義,請參閱使用分散式地圖複製大規模 CSV 資料教學課程。

{ "Map": { "Type": "Map", "ItemReader": { "ReaderConfig": { "InputType": "CSV", "CSVHeaderLocation": "FIRST_ROW" }, "Resource": "arn:aws:states:::s3:getObject", "Parameters": { "Bucket": "Database", "Key": "csv-dataset/ratings.csv" } }, "ItemProcessor": { "ProcessorConfig": { "Mode": "DISTRIBUTED", "ExecutionType": "EXPRESS" }, "StartAt": "LambdaTask", "States": { "LambdaTask": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:processCSVData" }, "End": true } } }, "Label": "Map", "End": true, "ResultWriter": { "Resource": "arn:aws:states:::s3:putObject", "Parameters": { "Bucket": "myOutputBucket", "Prefix": "csvProcessJobs" } } } }

執行分散式地圖的權限

當您在工作流程中包含分散式對應狀態時,Step Functions 需要適當的權限,才能允許狀態機器角色呼叫分散式對應狀態StartExecution API 動作。

以下 IAM 政策示例授予狀態機器角色執行分散式地圖狀態所需的最少權限。

注意

請確定您以使stateMachineName分散式地圖狀態的狀態機器名稱取代。例如 arn:aws:states:us-east-2:123456789012:stateMachine:mystateMachine

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": [ "arn:aws:states:region:accountID:stateMachine:stateMachineName" ] }, { "Effect": "Allow", "Action": [ "states:DescribeExecution", "states:StopExecution" ], "Resource": "arn:aws:states:region:accountID:execution:stateMachineName:*" } ] }

此外,您需要確保您擁有存取分散式地圖狀態中使用的 AWS 資源 (例如 Amazon S3 儲存貯體) 所需的最低權限。如需相關資訊,請參閱使用分散式地圖狀態的 IAM 政策

分散式地圖狀態欄位

若要在工作流程中使用「分散式地圖」狀態,請指定其中一個或多個欄位。除了一般狀態欄位之外,您還可以指定這些欄位

Type (必要)

設定狀態的類型,例如Map

ItemProcessor (必要)

包含下列指定Map狀態處理模式和定義的 JSON 物件。

  • ProcessorConfig— 指定狀態組Map態的 JSON 物件。此物件包含下列子欄位:

    • Mode— 設定為使DISTRIBUTED用分散式模式中的Map狀態。

      注意

      目前,如果您使用 Express 工作流程內的Map狀態,則無法將設定ModeDISTRIBUTED。但是,如果您在「標準」工作流程中使用Map狀態,則可以Mode將「」設定為DISTRIBUTED

    • ExecutionType— 將「對映」工作流程的執行類型指定為「標準」或「快速」。如果您DISTRIBUTEDMode子欄位指定了此欄位,則必須提供此欄位。如需工作流程類型的詳細資訊,請參閱標準與快速工作流程

  • StartAt— 指定指示工作流程中第一個狀態的字串。此字串區分大小寫,且必須與其中一個狀態物件的名稱相符。此狀態會先針對資料集中的每個項目執行。您提供給Map狀態的任何執行輸入會先傳遞至StartAt狀態。

  • States— 包含逗號分隔狀態集的 JSON 物件。在此物件中,您可以定義Map workflow.

ItemReader

指定資料集及其位置。狀Map態會從指定的資料集接收其輸入資料。

在分散式模式中,您可以使用從先前狀態傳遞的 JSON 承載,或使用大型 Amazon S3 資料來源做為資料集。如需詳細資訊,請參閱 ItemReader

ItemsPath (選用)

使用JsonPath語法來指定參考路徑,該 JSON 節點包含狀態輸入內的項目陣列。

在分散式模式中,只有當您使用上一個步驟中的 JSON 陣列做為狀態輸入時,才能指定此欄位。如需詳細資訊,請參閱 ItemsPath

ItemSelector (選用)

覆寫個別資料集項目的值,然後再傳遞至每個Map狀態反覆運算。

在此欄位中,您可以指定包含索引鍵值組集合的有效 JSON 輸入。這些配對可以是您在狀態機器定義中定義的靜態值、使用路徑從狀態輸入中選取的值,或是從前後關聯物件存取的值。如需詳細資訊,請參閱 ItemSelector

ItemBatcher (選用)

指定以批次方式處理資料集項目。然後,每個子工作流程執行都會接收這些項目的批次作為輸入。如需詳細資訊,請參閱 ItemBatcher

MaxConcurrency (選用)

指定可以 parallel 執行的子工作流程執行數目。解譯器最多只允許指定數目的 parallel 子工作流程執行。如果您未指定並行值或將其設定為零,則 Step Functions 不會限制並行執行 10,000 個 parallel 子工作流程執行。

注意

雖然您可以為 parallel 子工作流程執行指定較高的並行限制,但我們建議您不要超過下游 AWS 服務的容量,例如。 AWS Lambda

MaxConcurrencyPath (選用)

如果您想要使用MaxConcurrencyPath參考路徑從狀態輸入動態提供最大並行值,請使用。解析後,參考路徑必須選取值為非負整數的欄位。

注意

Map態不能同時包含MaxConcurrencyMaxConcurrencyPath

ToleratedFailurePercentage (選用)

定義在地圖執行中容許的失敗項目百分比。如果地圖執行超過此百分比,則會自動失敗。Step Functions 會計算失敗項目的百分比,因為失敗或逾時項目總數除以項目總數的結果。您必須指定一個介於零和 100 之間的值。如需詳細資訊,請參閱 分散式對應狀態的容許失敗臨界值

ToleratedFailurePercentagePath (選用)

如果您想要使用ToleratedFailurePercentagePath參照路徑,從狀態輸入動態提供容錯失敗百分比值,請使用。解析後,參考路徑必須選取值介於 0 和 100 之間的欄位。

ToleratedFailureCount (選用)

定義地圖執行中要容許的失敗項目數。如果地圖執行超過此數目,則會自動失敗。如需詳細資訊,請參閱 分散式對應狀態的容許失敗臨界值

ToleratedFailureCountPath (選用)

如果您想要使用ToleratedFailureCountPath參照路徑,從狀態輸入動態提供容忍失敗計數值,請使用。解析後,參考路徑必須選取值為非負整數的欄位。

Label (選用)

唯一識別Map狀態的字串。對於每個地圖運行,Step Functions 將標籤添加到地圖運行 ARN。以下是具demoLabel有名為的自訂標籤的 Map Run ARN 的範例:

arn:aws:states:us-east-1:123456789012:mapRun:demoWorkflow/demoLabel:3c39a231-69bb-3d89-8607-9e124eddbb0b

如果您未指定標籤,Step Functions 會自動產生唯一的標籤。

注意

標籤長度不能超過 40 個字元,在狀態機器定義中必須是唯一的,且不能包含下列任何字元:

  • 空白字元

  • 萬用字元 (? *)

  • 括號字元 (< > { } [ ])

  • 特殊字元 (: ; , \ | ^ ~ $ # % & ` ")

  • 控制字符(\\u0000-\\u001f\\u007f-\\u009f)。

Step Functions 可讓您為包含非 ASCII 字元的狀態機器、執行項目、活動和標籤建立名稱。這些非 ASCII 名稱不適用於 Amazon CloudWatch。若要確保您可以追蹤 CloudWatch 量度,請選擇僅使用 ASCII 字元的名稱。

ResultWriter (選用)

指定 Step Functions 寫入所有子工作流程執行結果的 Amazon S3 位置。

Step Functions 會合併所有子工作流程執行資料,例如執行輸入與輸出、ARN 及執行狀態。然後,它會將具有相同狀態的執行匯出到指定 Amazon S3 位置的個別檔案。如需詳細資訊,請參閱 ResultWriter

如果您不匯出Map狀態結果,它會傳回所有子工作流程執行結果的陣列。例如:

[1, 2, 3, 4, 5]
ResultPath (選用)

指定在輸入中放置迭代輸出的位置。然後,在輸入作為狀態的輸出傳遞之前,按照OutputPath字段指定(如果存在)進行過濾。如需詳細資訊,請參閱輸入和輸出處理

ResultSelector (選用)

傳遞鍵值對的集合,其中值是靜態的或從結果中選擇的。如需詳細資訊,請參閱 ResultSelector

提示

如果您在狀態機器中使用的「平行」或「對映」狀態傳回陣列陣列,您可以將它們轉換為具有ResultSelector欄位的平面陣列。如需詳細資訊,請參閱 扁平化數組數組

Retry (選用)

物件陣列 (稱為「擷取器」),可定義重試原則。如果狀態遇到執行階段錯誤,執行會使用重試原則。如需詳細資訊,請參閱 使用重試和使用 Catch 的狀態機器示例

注意

如果您定義 [分散式對應] 狀態的 [擷取器],則重試原則會套用至所有已啟動Map狀態的子工作流程執行。例如,假設您的Map狀態開始了三個子工作流程執行,其中一個執行失敗。發生失敗時,執行會使用Retry欄位 (如果已定義) 做為Map狀態。重試原則適用於所有子工作流程執行,而不僅僅是失敗的執行。如果一個或多個子工作流程執行失敗,則 Map Run 會失敗。

當您重試某個Map狀態時,它會建立新的 Map Run。

Catch (選用)

稱為 Catcher 的物件陣列,可定義後援狀態。Step Functions 使用中定義的捕獲器,Catch如果狀態遇到運行時錯誤。發生錯誤時,執行會先使用中Retry定義的任何擷取器。如果重試原則未定義或已用盡,則執行會使用其 Catcher (如果已定義)。如需詳細資訊,請參閱備用狀態

後續步驟

若要繼續學習有關分散式地圖狀態的更多資訊,請參閱下列資源: