Spark 任務 - Amazon EMR

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

Spark 任務

您可以在 type 參數設定為 的應用程式上執行 Spark 任務SPARK。任務必須與與 Amazon EMR發行版本相容的 Spark 版本相容。例如,當您使用 Amazon 6.6.0 EMR版執行任務時,您的任務必須與 Apache Spark 3.2.0 相容。如需每個版本應用程式版本的資訊,請參閱 Amazon EMR Serverless 發行版本

Spark 任務參數

當您使用 StartJobRun API 執行 Spark 任務時,您可以指定下列參數。

Spark 任務執行期角色

使用 ARN executionRoleArn為應用程式用來執行 Spark 任務IAM的角色指定 。此角色必須包含下列許可:

  • 從 S3 儲存貯體或資料所在的其他資料來源讀取

  • 從 PySpark 指令碼或JAR檔案所在的 S3 儲存貯體或字首讀取

  • 寫入您打算寫入最終輸出的 S3 儲存貯體

  • 將日誌寫入S3MonitoringConfiguration指定 的 S3 儲存貯體或字首

  • 如果您使用KMS金鑰來加密 S3 儲存貯體中的資料,則存取KMS金鑰

  • 如果您使用 Spark,存取 AWS Glue Data CatalogSQL

如果您的 Spark 任務讀取或寫入來自其他資料來源的資料,請在此IAM角色中指定適當的許可。如果您未提供這些許可給IAM角色,任務可能會失敗。如需詳細資訊,請參閱 Amazon EMR Serverless 的任務執行期角色儲存日誌

Spark 任務驅動程式參數

jobDriver 使用 為任務提供輸入。任務驅動程式參數只接受一個您要執行的任務類型值。對於 Spark 任務,參數值為 sparkSubmit。您可以使用此任務類型,透過 Spark 提交執行 Scala、Java、 PySparkSparkR 和任何其他支援的任務。Spark 任務具有下列參數:

  • sparkSubmitParameters – 這些是您要傳送至任務的其他 Spark 參數。使用此參數可覆寫預設 Spark 屬性,例如驅動程式記憶體或執行器數量,例如 --conf--class引數中定義的執行器數量。

  • entryPointArguments – 這是您要傳遞至主檔案JAR或 Python 檔案的引數陣列。應使用 entrypoint 程式碼讀取這些參數。以逗號分隔陣列中的每個引數。

  • entryPoint – 這是 Amazon S3 中您要執行的主檔案JAR或 Python 檔案的參考。如果您正在執行 Scala 或 Java JAR,SparkSubmitParameters請使用 --class 引數在 中指定主要項目類別。

如需其他資訊,請參閱透過 spark-submit 啟動應用程式

Spark 組態覆寫參數

使用 configurationOverrides 覆寫監控層級和應用程式層級組態屬性。此參數接受具有下列兩個欄位的JSON物件:

  • monitoringConfiguration ‐ 使用此欄位來指定 Amazon S3 URL(s3MonitoringConfiguration),您希望 EMR Serverless 任務在其中儲存 Spark 任務的日誌。請確定您已使用與託管應用程式相同的 AWS 帳戶 建立此儲存貯體,並在執行任務 AWS 區域 的相同 中建立此儲存貯體。

  • applicationConfiguration – 若要覆寫應用程式的預設組態,您可以在此欄位中提供組態物件。您可以使用短期語法來提供組態,也可以參考JSON檔案中的組態物件。組態物件是由分類、屬性和選用的巢狀組態所組成。屬性由您想要在檔案中覆寫的設定組成。您可以為單一JSON物件中的多個應用程式指定多個分類。

    注意

    可用的組態分類會因特定無EMR伺服器版本而有所不同。例如,自訂 Log4j 的分類spark-executor-log4j2spark-driver-log4j2且僅適用於 6.8.0 版和更新版本。

如果您在應用程式覆寫和 Spark 提交參數中使用相同的組態,Spark 提交參數會優先處理。組態的優先順序如下,從最高到最低:

  • EMR Serverless 在建立 時提供的組態SparkSession

  • 您以 提供的組態sparkSubmitParameters--conf 引數。

  • 當您啟動任務時,作為應用程式一部分提供的組態會覆寫 。

  • 您在建立應用程式runtimeConfiguration時作為 的一部分提供的組態。

  • Amazon EMR用於 版本的最佳化組態。

  • 應用程式的預設開放原始碼組態。

如需在應用程式層級宣告組態以及在任務執行期間覆寫組態的詳細資訊,請參閱 EMR Serverless 的預設應用程式組態

Spark 動態資源配置最佳化

使用 dynamicAllocationOptimization 來最佳化 EMR Serverless 中的資源用量。在 Spark 組態分類true中將此屬性設定為 表示 為 EMR Serverless,以最佳化執行器資源配置,以更好地調整 Spark 請求和取消執行器的速度與 EMR Serverless 建立和釋放工作者的速度。如此一來,EMRServerless 就更能在各個階段以最佳方式重複使用工作者,因此在執行具有多個階段的任務時降低成本,同時維持相同的效能。

此屬性適用於所有 Amazon EMR發行版本。

以下是使用 的範例組態分類dynamicAllocationOptimization

[ { "Classification": "spark", "Properties": { "dynamicAllocationOptimization": "true" } } ]

如果您使用的是動態配置最佳化,請考慮下列事項:

  • 此最佳化適用於您為其啟用動態資源配置的 Spark 任務。

  • 為了獲得最佳成本效率,我們建議您根據您的工作負載,使用任務層級設定spark.dynamicAllocation.maxExecutors應用程式層級最大容量設定來設定工作者的上擴展範圍。

  • 您可能無法看到更簡單任務的成本改善。例如,如果您的任務在小型資料集上執行,或在單一階段完成執行,Spark 可能不需要更多執行器或多個擴展事件。

  • 具有大量階段、較小階段,然後再次出現大型階段的任務,可能會在任務執行期中經歷迴歸。隨著 EMR Serverless 更有效率地使用資源,可能會導致較大型階段的可用工作者減少,進而延長執行時間。

Spark 任務屬性

下表列出選用的 Spark 屬性及其預設值,您可以在提交 Spark 任務時覆寫這些屬性。

金錀 描述 預設值
spark.archives Spark 擷取到每個執行器工作目錄的封存逗號分隔清單。支援的檔案類型包括 .jar .tar.gz.tgz.zip。若要指定要擷取的目錄名稱,請在要擷取的檔案名稱#後面新增 。例如:file.zip#directory NULL
spark.authenticate 開啟 Spark 內部連線身分驗證的選項。 TRUE
spark.driver.cores 驅動程式使用的核心數量。 4
spark.driver.extraJavaOptions Spark 驅動程式的其他 Java 選項。 NULL
spark.driver.memory 驅動程式使用的記憶體量。 14G
spark.dynamicAllocation.enabled 開啟動態資源配置的選項。此選項會根據工作負載,將向應用程式註冊的執行程式數量向上或向下擴展。 TRUE
spark.dynamicAllocation.executorIdleTimeout Spark 移除執行器之前,執行器可以保持閒置的時間長度。這僅適用於開啟動態配置的情況。 60 秒
spark.dynamicAllocation.initialExecutors 如果您開啟動態配置,要執行的執行器初始數量。 3
spark.dynamicAllocation.maxExecutors 如果您開啟動態配置,則執行器數量的上限。

對於 6.10.0 和更新版本, infinity

對於 6.9.0 和更低版本, 100

spark.dynamicAllocation.minExecutors 如果您開啟動態配置,執行器數量的下限。 0
spark.emr-serverless.allocation.batch.size 執行器配置的每個週期中要請求的容器數量。每個配置週期之間有一秒的差距。 20
spark.emr-serverless.driver.disk Spark 驅動程式磁碟。 20G
spark.emr-serverless.driverEnv.[KEY] 將環境變數新增至 Spark 驅動程式的選項。 NULL
spark.emr-serverless.executor.disk Spark 執行器磁碟。 20G
spark.emr-serverless.memoryOverheadFactor 設定記憶體額外負荷,以新增至驅動程式和執行器容器記憶體。 0.1
spark.emr-serverless.driver.disk.type 連接至 Spark 驅動程式的磁碟類型。 標準
spark.emr-serverless.executor.disk.type 連接至 Spark 執行器的磁碟類型。 標準
spark.executor.cores 每個執行器使用的核心數目。 4
spark.executor.extraJavaOptions Spark 執行器的其他 Java 選項。 NULL
spark.executor.instances 要配置的 Spark 執行器容器數量。 3
spark.executor.memory 每個執行器使用的記憶體量。 14G
spark.executorEnv.[KEY] 將環境變數新增至 Spark 執行器的選項。 NULL
spark.files 每個執行器的工作目錄中要進入的檔案逗號分隔清單。您可以使用 存取執行器中這些檔案的檔案路徑SparkFiles.get(fileName) NULL
spark.hadoop.hive.metastore.client.factory.class Hive 中繼存放區實作類別。 NULL
spark.jars 要新增至驅動程式和執行器執行期類別路徑的其他 jar。 NULL
spark.network.crypto.enabled 開啟 AES型RPC加密的選項。這包括在 Spark 2.2.0 中新增的身分驗證通訊協定。 FALSE
spark.sql.warehouse.dir 受管資料庫和資料表的預設位置。 的值 $PWD/spark-warehouse
spark.submit.pyFiles 以逗號分隔的清單.zip,列出要放置在 PYTHONPATH Python 應用程式中的 .egg、 或 .py 檔案。 NULL

下表列出預設 Spark 提交參數。

金錀 描述 預設值
archives Spark 擷取到每個執行器工作目錄的封存逗號分隔清單。 NULL
class 應用程式的主要類別 (適用於 Java 和 Scala 應用程式)。 NULL
conf 任意 Spark 組態屬性。 NULL
driver-cores 驅動程式使用的核心數量。 4
driver-memory 驅動程式使用的記憶體量。 14G
executor-cores 每個執行器使用的核心數目。 4
executor-memory 執行器使用的記憶體量。 14G
files 以逗號分隔的檔案清單,以放置在每個執行器的工作目錄中。您可以使用 存取執行器中這些檔案的檔案路徑SparkFiles.get(fileName) NULL
jars 要包含在驅動程式和執行器類別路徑上的以逗號分隔的 jar 清單。 NULL
num-executors 要啟動的執行程式數目。 3
py-files 以逗號分隔的清單.zip,列出要放置在PYTHONPATH適用於 Python 應用程式的 上的 .egg、 或 .py 檔案。 NULL
verbose 開啟其他偵錯輸出的選項。 NULL

Spark 範例

下列範例示範如何使用 StartJobRunAPI來執行 Python 指令碼。如需使用此範例的教學課程 end-to-end,請參閱 Amazon EMR Serverless 入門。您可以在 EMR Serverless Samples GitHub 儲存庫中找到有關如何執行 PySpark 任務和新增 Python 相依性的其他範例。

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://us-east-1.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py", "entryPointArguments": ["s3://amzn-s3-demo-destination-bucket/wordcount_output"], "sparkSubmitParameters": "--conf spark.executor.cores=1 --conf spark.executor.memory=4g --conf spark.driver.cores=1 --conf spark.driver.memory=4g --conf spark.executor.instances=1" } }'

下列範例示範如何使用 StartJobRunAPI來執行 Spark JAR。

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": ["1"], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1" } }'