本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
EMR Spark MagicCommitProtocol
從 EMR 6.15.0 之後,使用 S3A 檔案系統時,MagicCommitProtocol 會成為 Spark 的預設 FileCommitProtocol。
MagicCommitProtocol
MagicCommitProtocol 是 FileCommitProtocol
MagicCommitProtocol 是使用 S3A 檔案系統時,在 Amazon Elastic Map Reduce (EMR) 上執行的 Spark 使用的預設 FileCommitProtocol 實作。MagicCommitProtocol 在內部使用 MagicV2Committer 執行檔案寫入 Amazon S3。
對於靜態插入操作,MagicCommitProtocol 在任務遞交階段將檔案寫入任務的輸出位置。相反地,對於動態插入覆寫操作,任務嘗試寫入的檔案只會在任務遞交時出現在任務的輸出位置。這是透過在任務遞交呼叫時將遞交中繼資料匯出回 Spark 驅動程式來實現的。
啟用 MagicCommitProtocol
使用 S3A 檔案系統時,在 Amazon Elastic Map Reduce (EMR) 上執行的 Spark 預設會啟用 MagicCommitProtocol。
若要使用 S3A 檔案系統,您可以:
-
使用定義資料表、分割區或目錄
s3a://
時所用的檔案配置。 -
在 core-site.xml
fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
中設定組態。
停用 MagicCommitProtocol
-
您可以在 中將其硬式編碼
SparkConf
、在 Spark shell 或spark-submit
和spark-sql
工具中將其做為--conf
參數傳遞,或在 中將其spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol
設定為 falseconf/spark-defaults.conf
。如需詳細資訊,請參閱 Apache Spark 文件中的 Spark 組態。 下列範例示範如何在執行
spark-sql
命令時停用 MagicCommitProtocol。spark-sql \ --conf spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol=false \ -e "INSERT OVERWRITE TABLE target_table SELECT * FROM source_table;"
-
使用
spark-defaults
組態分類將spark.sql.execution.datasources.SQLEmrOptimizedCommitProtocol.leverageMagicCommitProtocol
屬性設定為 false。如需詳細資訊,請參閱設定應用程式。
MagicCommitProtocol 考量事項
-
對於靜態分割區插入,在 Spark 執行器上,MagicCommitProtocol 會對任務嘗試寫入的每個檔案耗用少量記憶體,直到任務遞交或中止為止。在大多數任務中,記憶體的消耗量極少。Spark 驅動程式沒有額外的記憶體需求
-
對於動態分割區插入,在 Spark 驅動程式上,MagicCommitProtocol 需要記憶體來儲存每個遞交檔案的中繼資料資訊,直到任務遞交或中止為止。在大多數作業中,會忽略預設 Spark 驅動程式記憶體設定。
對於具有寫入大量檔案之長時間執行任務的作業,遞交通訊協定耗用的記憶體量可能會很明顯,並需要調整配置給 Spark,特別是 Spark 執行器的記憶體。您可以使用
spark.driver.memory
屬性調整 Spark 驅動程式的記憶體,或使用spark.executor.memory
屬性調整 Spark 執行器的記憶體。作為準則,撰寫 100,000 個檔案的單一任務通常需要額外的 200MB 記憶體。如需詳細資訊,請參閱 Apache Spark 組態文件中的應用程式屬性。