我的 Apache Hadoop 或 Apache Spark 任務的使用者快取使用了分割區上的所有磁碟空間。Amazon EMR 任務失敗或 HDFS NameNode 服務處於安全模式。
簡短說明
在 Amazon EMR 叢集上,YARN 設定為允許任務將快取資料寫入 /mnt/yarn/usercache。當您處理大量資料或執行多個並行任務時,/mnt 檔案系統可能會填滿。這會導致節點管理員無法處理部分節點,且工作凍結或失敗。
若要解決此問題,請使用下列其中一種方法:
- 如果您沒有長時間執行或串流的任務,請調整 YARN NodeManager 的使用者快取保留設定。
- 如果您擁有長時間執行或串流的任務,請向上擴展 Amazon Elastic Block Store (Amazon EBS) 磁碟區。
解決方法
調整 NodeManager 的使用者快取保留設定
下列屬性定義快取清除設定:
- **yarn.nodemanager.localizer.cache.cleanup.interval-ms:**這是快取清理間隔。預設值為 60 萬毫秒。在此間隔之後,如果快取大小超過在 yarn.nodemanager.localizer.cache.target-size-mb 中設定的值,系統會刪除執行中的容器未使用的檔案。
- **yarn.nodemanager.localizer.cache.target-size-mb:**這是快取允許的最大磁碟空間。預設值為 10,240 MB。在快取磁碟大小超過此值時,系統會按 yarn.nodemanager.localizer.cache.cleanup.interval-ms 中設定的間隔刪除執行中的容器未使用的檔案。
若要在叢集上設定清理間隔和最大磁碟空間大小,請執行下列步驟:
-
在每個核心和任務節點上開啟 /etc/hadoop/conf/yarn-site.xml。
-
減少每個核心和任務節點的 yarn.nodemanager.localizer.cache.cleanup.interval 和 yarn.nodemanager.localizer.cache.target-size-mb 的值。
例如:
sudo vim /etc/hadoop/conf/yarn-site.xmlyarn.nodemanager.localizer.cache.cleanup.interval-ms 400000
yarn.nodemanager.localizer.cache.target-size-mb 5120
-
在每個核心和任務節點上執行下列命令,以重新啟動 NodeManager:
EMR 5.29 及更早版本
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
EMR 5.30.0 及更高版本
sudo stop hadoop-yarn-nodemanager.service
sudo systemctl start hadoop-yarn-nodemanager.service
-
若要在啟動新叢集時設定清理間隔和磁碟空間大小上限,請新增類似以下項目的組態物件:
[
{
"Classification": "yarn-site",
"Properties": {
"yarn.nodemanager.localizer.cache.cleanup.interval-ms": "400000",
"yarn.nodemanager.localizer.cache.target-size-mb": "5120"
}
}
]
刪除服務不會在執行中的容器上完成。這表示即使在您調整使用者快取保留設定之後,資料仍可能會溢出至下列路徑並填滿檔案系統:
{'yarn.nodemanager.local-dirs'}/usercache/user/appcache/application_id ,
擴展 EMR 叢集節點上的 EBS 磁碟區
若要擴展執行中 EMR 叢集上的儲存空間,請參閱動態擴展 Amazon EMR 叢集上的儲存存空間。
若要擴展新 EMR 叢集上的儲存存空間,請在建立 EMR 叢集時指定較大的磁碟區大小。您也可以在將節點新增至現有叢集時執行此操作:
- **Amazon EMR 5.22.0 及更新版本:**預設 EBS 儲存量會根據 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的大小增加。如需有關為每個執行個體類型配置的預設儲存空間量和磁碟區數量的詳細資訊,請參閱 Default Amazon EBS storage for instances。
- Amazon EMR 5.21 及更新版本:預設的 EBS 磁碟區大小為 32 GB。為 ** /mnt ** 分割區保留 27 GB。HDFS、YARN、使用者快取以及所有應用程式都使用 /mnt 分割區。視需要增加 EBS 磁碟區的大小,例如 100-500 GB。您也可以指定多個掛載為 /mnt1、/mnt2 等等的 EBS 磁碟區。
對於 Spark 串流任務,您也可以在不再需要資料後執行 RDD.unpersist()。或者,在 Scala 中呼叫 System.gc(),或在 Python 中呼叫 sc._jvm.System.gc(),以啟動 JVM 垃圾回收並移除中繼隨機排序檔案。