我的 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:**这是缓存清理时间间隔。默认值为 600,000 毫秒。在此时间间隔之后,如果缓存大小超过了 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 集群上纵向扩展存储空间,请参阅 Dynamically scale up storage on Amazon EMR clusters。
要在新 EMR 集群上纵向扩展存储,请在创建 EMR 集群时指定更大的卷大小。您也可以在向现有集群添加节点时执行此操作:
- **Amazon EMR 版本 5.22.0 及更高版本:**默认的 EBS 存储量根据 Amazon Elastic Compute Cloud(Amazon EC2)实例的大小而增加。有关每种实例类型的默认存储量和卷数的更多信息,请参阅实例的默认 Amazon EBS 存储。
- **Amazon EMR 版本 5.21 及更早版本:**默认 EBS 卷大小为 32 GB。27 GB 已为 ** /mnt ** 分区预留。HDFS、YARN、用户缓存和所有应用程序都使用 /mnt 分区。根据需要增加 EBS 卷的大小。您还可以指定多个 EBS 卷,将这些卷挂载为 /mnt1 或 /mnt2。
对于 Spark 流作业,您还可以在不再需要相关数据后执行 RDD.unpersist()。或者,在 Scala 中显式调用 System.gc(),或在 Python 中调用 sc._jvm.System.gc(),以启动 JVM 垃圾回收并删除处理过程中的临时文件。