View a markdown version of this page

具有限制執行的工作負載分割 - AWS Glue

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

具有限制執行的工作負載分割

Spark 應用程式中的錯誤通常來自於效率低下的 Spark 指令碼,分散式記憶體執行大規模轉換以及資料集異常。有很多原因可能會導致驅動程式或執行程序的記憶體不足問題,例如資料偏斜,列出太多物件或大資料混洗。當您使用 Spark 處理大量積壓資料時,通常會出現這些問題。

AWS Glue 可讓您解決 OOM 問題,並透過工作負載分割讓 ETL 處理更輕鬆。啟用任務負載分割後,每個 ETL 任務執行只會挑選未處理的資料,而資料集大小或此任務執行時要處理的檔案數目上限。未來的任務執行將處理剩餘的資料。例如,如果需要處理 1000 個檔案,您可以將檔案數目設定為 500 個,並將它們分成兩個任務執行。

只有 Amazon S3 資料來源支援工作負載分割。

啟用工作負載分割

您可以透過手動設定指令碼中的選項或新增目錄資料表屬性來啟用限制執行。

若要在指令碼中啟用具有限制執行的工作負載分割:
  1. 若要避免重新處理資料,請在新任務或現有任務中啟用任務書籤。如需詳細資訊,請參閱使用任務書籤追蹤已處理的資料。

  2. 修改您的指令碼,並在AWS Glue getSource API 的附加選項中設定有界限制。您還應該設定工作書籤的轉換內容,以儲存 state 元素。例如:

    Python

    glueContext.create_dynamic_frame.from_catalog( database = "database", table_name = "table_name", redshift_tmp_dir = "", transformation_ctx = "datasource0", additional_options = { "boundedFiles" : "500", # need to be string # "boundedSize" : "1000000000" unit is byte } )

    Scala

    val datasource0 = glueContext.getCatalogSource( database = "database", tableName = "table_name", redshiftTmpDir = "", transformationContext = "datasource0", additionalOptions = JsonOptions( Map("boundedFiles" -> "500") // need to be string //"boundedSize" -> "1000000000" unit is byte ) ).getDynamicFrame()
    val connectionOptions = JsonOptions( Map("paths" -> List(baseLocation), "boundedFiles" -> "30") ) val source = glueContext.getSource("s3", connectionOptions, "datasource0", "")
若要在資料目錄資料表中啟用具有限制執行的工作負載分割:
  1. 在資料目錄的資料表結構 parameters 欄位中設定鍵值對。如需詳細資訊,請參閱檢視與編輯資料表的詳細資訊。

  2. 設定資料集大小或處理的檔案數目的上限:

    • 將 boundedSize 設定為資料集目標大小 (以位元組為單位)。從資料表達到目標大小後,任務執行將會停止。

    • 設定 boundedFiles 為目標檔案數量。處理檔案的目標數目後,任務執行將會停止。

    注意

    您應該只設定一個 boundedSize 或 boundedFiles,因為只支援單一邊界。

設定 AWS Glue 觸發以自動執行任務

啟用限定執行之後,您可以設定 AWS Glue 觸發自動執行任務,並以循序執行遞增方式載入資料。前往 AWS Glue 主控台並建立觸發、設定排程時間,並連接至您的任務。然後它會自動觸發下一個任務執行並處理新批次的資料。

您也可以使用 AWS Glue 工作流程來協調多個任務,以平行處理來自不同分割區的資料。如需詳細資訊,請參閱 AWS Glue 觸發和 AWS Glue 工作流程。

如需更多關於使用案例和選項的詳細資訊,請參閱部落格在 AWS Glue 中使用工作負載分割來最佳化 Spark 應用程式。