執行無EMR伺服器任務時使用 Spark 組態 - Amazon EMR

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

執行無EMR伺服器任務時使用 Spark 組態

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

Spark 任務參數

當您使用 StartJobRunAPI執行 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 ‐ 使用此欄位指定您希望 EMR Serverless 任務存放 Spark 任務日誌的 Amazon S3 URL(s3MonitoringConfiguration)。請確定您已使用 AWS 帳戶 託管您應用程式的相同 ,以及在您執行任務 AWS 區域 的相同 建立此儲存貯體。

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

    注意

    可用的組態分類會因特定無EMR伺服器版本而有所不同。例如,自訂 Log4j spark-driver-log4j2和 的分類spark-executor-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 要新增至驅動程式和執行器執行期 classpath 的其他 jar。 NULL
spark.network.crypto.enabled 開啟 AES型RPC加密的選項。這包括在 Spark 2.2.0 中新增的身分驗證通訊協定。 FALSE
spark.sql.warehouse.dir 受管資料庫和資料表的預設位置。 的值 $PWD/spark-warehouse
spark.submit.pyFiles 以逗號分隔的 .zip.egg .py 檔案清單,以放置在PYTHONPATH適用於 Python 應用程式的 中。 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" } }'