跳至內容

如何解決 Amazon EMR 中 Spark 作業的「Container killed on request.Exit code is 137」錯誤?

2 分的閱讀內容
0

我 Amazon EMR 中的 Apache Spark 作業失敗,而且我收到「Container killed on request.Exit code is 137」錯誤。

簡短說明

當容器記憶體不足時,YARN 會自動停止容器,且您可能會收到以下錯誤訊息:

「"Container killed on request" stage failure: Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task 2 in stage 3.0 failed 4 times, most recent failure: Lost task 2.3 in stage 3.0 (TID 23, ip-###-###-##-###.compute.internal, executor 4): ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Container marked as failed: container_1516900607498_6585_01_000008 on host: ip-###-###-##-###.compute.internal.Exit status: 137.Diagnostics: Container killed on request.Exit code is 137」

解決方法

增加驅動程式或容器記憶體

若要增加執行中叢集或單一作業的容器記憶體,請先連線到叢集的主節點。然後,在您的 spark-defaults.conf Spark 組態檔中修改 spark.executor.memoryspark.driver.memory 參數。

執行中叢集

若要開啟 spark-defaults.conf,請執行以下命令:

sudo vim /etc/spark/conf/spark-defaults.conf

若要增加容器記憶體,請在 spark-defaults.conf 中新增或修改 spark.executor.memoryspark.driver.memory 參數:

spark.executor.memory 10g
spark.driver.memory 10g

**注意事項:**請將 10g 替換為適合您叢集可用資源和工作負載需求的值。

單一作業

若要增加記憶體,請在執行以下 spark-submit 命令時,使用 --executor-memory--driver-memory 選項:

spark-submit
  --executor-memory 10g
  --driver-memory 10g
  ...

**注意事項:**請將 10g 替換為適合您叢集可用資源和工作負載需求的值。

您也可以在 Spark 組態分類中將 maximizeResourceAllocation 設定為 true

新增更多 Spark 分區

如果您無法增加容器記憶體,請增加 Spark 分區數,以減少處理的資料量和使用的記憶體。

若要新增更多 Spark 分區,請先 連線到叢集的主節點,然後在 Spark shell 中執行以下命令:

val numPartitions = 500
val newDF = df.repartition(numPartitions)

**注意事項:**請將 500 替換為符合您資料大小的分區數。

增加隨機分區的數量

如果問題發生在寬轉換期間,例如 joingroupBy,請連線到叢集的主節點,並新增更多隨機分區。預設值為 200。

執行中叢集

若要開啟 spark-defaults.conf,請執行以下命令:

sudo vim /etc/spark/conf/spark-defaults.conf

若要將隨機分區新增到您的組態檔,請執行以下命令:

spark.sql.shuffle.partitions 500

**注意事項:**請將 500 替換為符合您資料大小的分區數。

單一作業

若要新增隨機分區,請在執行 spark-submit 時,使用 --conf spark.sql.shuffle.partitions 選項:

spark-submit
  --conf
  spark.sql.shuffle.partitions=500
  ...

**注意事項:**請將 500 替換為符合您資料大小的分區數。

減少執行程式核心數

當您減少執行程式核心數時,也會降低執行程式同時處理任務的最大數量。這會減少容器使用的記憶體量。若要減少執行程式核心數,請先連線到叢集的主節點,然後修改您的執行程式核心參數。

執行中叢集

在主節點上開啟 spark-defaults.conf 檔案:

sudo vim /etc/spark/conf/spark-defaults.conf

若要減少執行程式核心數,請修改 spark.executor.cores 參數:

spark.executor.cores  1

**注意事項:**請將 1 替換為您所需的最小執行程式核心數。

單一作業

若要減少執行程式核心數,請在執行 spark-submit 時使用 --executor-cores 選項:

spark-submit
   --executor-cores 1
   ...

增加執行個體大小

當作業系統 (OS) 記憶體不足時,OS oom_reaper 也可能會停止 YARN 容器。如果是 oom_reaper 導致錯誤,請使用具有更多 RAM 的較大 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。若要確保 YARN 容器不會使用所有 RAM,請減少 yarn.nodemanager.resource.memory-mb

若要判斷是否為 oom_reaper 導致錯誤,請檢閱您的 Amazon EMR 執行個體日誌中的 dmesg 命令輸出。首先,使用 YARN Resource Manger UI 或日誌,找出已停止 YARN 容器執行所在的核心節點或任務節點。然後,檢查該節點上容器停止前後的 Amazon EMR 執行個體狀態日誌。

在以下範例中,核心會停止 ID 為 36787 的程序,該程序對應至 YARN container_165487060318_0001_01_000244

# hows the kernel lookingdmesg | tail -n 25
[ 3910.032284] Out of memory: Kill process 36787 (java) score 96 or sacrifice child
[ 3910.043627] Killed process 36787 (java) total-vm:15864568kB, anon-rss:13876204kB, file-rss:0kB, shmem-rss:0kB
[ 3910.748373] oom_reaper: reaped process 36787 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

檢查磁碟使用率和節點效能下降

如果上述疑難排解選項未解決問題,請在執行個體狀態日誌中使用 df-h 旗標來檢查磁碟使用率和節點效能下降。也請在 AWS Health 儀表板上檢查節點狀態。

相關資訊

如何解決 Amazon EMR 上 Spark 中的「Container killed by YARN for exceeding memory limits」錯誤?

如何對 Amazon EMR 上 Spark 作業的階段失敗進行疑難排解?

AWS 官方已更新 1 年前