我提交了 Apache Spark 應用程式到 Amazon EMR 叢集。應用程式失敗,並出現類似下列內容的「裝置上沒有剩餘空間」階段失敗: 作業因階段失敗而中止: 階段 8.0 中的任務 31 失敗了 4 次,最近的失敗: 在階段 8.0 中遺失了任務 31.3 (TID 2036,ip-xxx-xxx-xx-xxx.compute.internal,執行器 139):org.apache.spark.memory.SparkOutOfMemoryError:在 org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@1a698b89 上調用 spill() 時出錯: 裝置上沒有剩餘空間
簡短描述
Spark 使用核心和任務節點上的本機磁碟來儲存中繼資料。如果磁碟空間不足,則作業會失敗並顯示 "no space left on device"(裝置上沒有剩餘空間)錯誤。請使用下列其中一種方法來解決此錯誤:
- 新增更多 Amazon Elastic Block Store (Amazon EBS) 容量。
- 新增更多 Spark 分割區。
- 使用啟動程序動作來動態縱向擴展核心和任務節點上的儲存空間。如需詳細資訊和啟動程序動作指令碼範例,請參閱動態縱向擴展 Amazon EMR 叢集上的儲存空間。
解決方法
新增更多 EBS 容量
對於新叢集:使用較大的 EBS 磁碟區
啟動 Amazon EMR 叢集,然後選擇具有較大 EBS 磁碟區的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體類型。如需有關為每個執行個體類型配置的儲存空間量和磁碟區數量的詳細資訊,請參閱執行個體的預設 Amazon EBS 儲存空間。
對於執行中叢集:新增更多 EBS 磁碟區
1. 如果較大的 EBS 磁碟區無法解決問題,請附加更多 EBS 磁碟區至核心和任務節點。
2. 格式化並掛載附加的磁碟區。請務必使用正確的磁碟編號 (例如,/mnt1 或 /mnt2 而非 /data)。
3. 使用 SSH 連線至節點。
4. 建立一個 /mnt2/yarn 目錄,然後將目錄的所有權設置為 YARN 使用者:
sudo mkdir /mnt2/yarn
chown yarn:yarn /mnt2/yarn
5. 在 /etc/hadoop/conf/yarn-site.xml 的 yarn.nodemanager.local-dirs 屬性中新增 /mnt2/yarn 目錄。範例:
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/mnt/yarn,/mnt1/yarn,/mnt2/yarn</value>
</property>
6. 重新啟動 NodeManager 服務:
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
新增更多 Spark 分割區
根據叢集中核心和任務節點的數量,考慮增加 Spark 分割區的數量。使用下面的 Scala 代碼新增更多的 Spark 分割區:
val numPartitions = 500
val newDF = df.repartition(numPartitions)
相關資訊
如何對 Amazon EMR 上 Spark 作業的階段失敗進行疑難排解?