我想在 Amazon EMR 集群上运行 Apache Spark 作业,但是核心节点的磁盘空间几乎耗尽。
解决方法
确定您的核心节点是否运行状况不佳
当至少连接了一个 Amazon Elastic Block Store (Amazon EBS) 卷的节点的磁盘利用率达到 90% 以上时,这些节点被认为运行状况不佳。要确定哪些节点的磁盘利用率已达到 90%,请完成以下步骤:
- 查看 MRUnhealthyNodes Amazon CloudWatch 指标。此指标显示 EMR 集群中运行状况不佳的节点数量。
**注意:**您还可以创建 CloudWatch 警报来监控 MRUnhealthyNodes 指标。
- 连接到主节点并访问实例控制器日志(位于 /emr/instance-controller/log/instance-controller.log)。
- 在实例控制器日志中,搜索 InstanceJointStatusMap 以确定哪些节点运行状况不佳。
有关详细信息,请参阅以下网页中的“由于节点运行状况不佳,导致磁盘利用率较高”部分:如何解决 Amazon EMR 上 Spark 中的“ExecutorLostFailure: Slave lost”错误?
- 要确定挂载是否具有高利用率,请登录核心节点,然后运行以下命令:
df -h
删除不必要的本地和临时 Spark 应用程序文件
运行 Spark 作业时,Spark 应用程序会创建占用核心节点剩余磁盘空间的本地文件。例如,如果 df -h 命令显示 /mnt 使用超过 90% 的磁盘空间,请检查哪些目录或文件的利用率很高。
在核心节点上运行以下命令以查看使用最多磁盘空间的前 10 个目录:
cd /mnt
sudo du -hsx * | sort -rh | head -10
如果 /mnt/hdfs 目录的利用率很高,请检查 Hadoop Distributed File System (HDFS) 的使用情况并删除任何不必要的文件,例如日志文件。要检查特定目录的空间利用率,请运行以下命令:
hdfs dfsadmin -report
hadoop fs -du -s -h /path/to/dir
注意: 将 /path/to/dir 替换为要检查空间利用率的目录的路径。
缩短 Spark 事件和 YARN 容器日志的保留期
/var/log 目录存储日志文件,例如 Spark 事件日志和 YARN 容器日志。要自动清除 HDFS 中的日志文件,请缩短保留期。
缩短 Spark 作业历史记录文件的默认保留期
默认情况下,Spark 作业历史文件位于 /var/log/spark/apps 中。当文件系统历史记录清理程序运行时,Spark 会删除超过七天的作业历史记录文件。
要缩短正在运行的集群的默认保留期,请完成以下步骤:
- 使用 SSH 连接到主节点。
- 在 /etc/spark/conf/spark-defaults.conf 中添加或更新以下值:
------spark.history.fs.cleaner.enabled true
spark.history.fs.cleaner.interval 12h
spark.history.fs.cleaner.maxAge 1d
------
前面的配置每 12 小时运行一次清理程序。该配置会清除 1 天以上的文件。您可以在 spark.history.fs.cleaner.internval 和 spark.history.fs.cleaner.maxAge 参数中自定义该时间段。
- 重启 Spark History Server。
要缩短启动集群时 Spark 作业历史记录文件的默认保留期,请使用以下配置:
{
"Classification": "spark-defaults",
"Properties": {
"spark.history.fs.cleaner.enabled": "true",
"spark.history.fs.cleaner.interval": "12h",
"spark.history.fs.cleaner.maxAge": "1d"
}
}
您可以在 spark.history.fs.cleaner.interval 和 spark.history.fs.cleaner.maxAge 参数中自定义该时间段。
有关这些参数的详细信息,请参阅 Apache Spark 网站上的 Monitoring and instrumentation(监控和检测)。
缩短 YARN 容器日志的默认保留期
Spark 应用程序日志是您的 Spark 作业的 YARN 容器日志,位于核心节点上的 /var/log/hadoop-yarn/apps 中。当应用程序完成运行后,Spark 会将这些日志移至 HDFS。默认情况下,YARN 在 HDFS 上保留应用程序日志 48 小时。要缩短保留期,请完成以下步骤:
- 使用 SSH 连接到主节点、核心节点或任务节点。
- 打开 EMR 集群中每个节点(主节点、核心节点和任务节点)上的 /etc/hadoop/conf/yarn-site.xml 文件。
- 减少所有节点上 yarn.log-aggregation.retain-seconds 属性的值。
- 重启 ResourceManager 进程守护程序。
您也可以重新配置集群以缩短保留期。
减少 /mnt/yarn 的使用量
当 /mnt/yarn 目录中的磁盘使用率很高时,调整用户缓存保留期或扩展节点上的 EBS 容量。有关详细信息,请参阅如何停止 Hadoop 或 Spark 作业的用户缓存,以让缓存不要占用 Amazon EMR 中过多的磁盘空间?
调整集群大小或扩展 Amazon EMR
为避免 HDFS 空间问题,请扩展核心节点的数量。而且,如果 HDFS 目录以外的目录已满,请扩展核心或任务节点的数量。有关详细信息,请参阅使用 Amazon EMR 集群扩展来适应不断变化的工作负载。
您还可以在现有节点中扩展 EBS 卷或使用动态扩展脚本。有关详细信息,请参阅如何解决 Amazon EMR 上 Apache Spark 作业中的“no space left on device”阶段故障?
相关信息
配置 Amazon EMR 集群硬件和网络
HDFS 配置
使用 Amazon EMR 处理存储和文件系统