我在 Amazon EMR 集群上运行 Apache Spark 任务,核心节点几乎没有磁盘空间。
解决方法
确定哪些核心节点运行状况不佳
对于至少已连接一个 Amazon Elastic Block Store(Amazon EBS)卷的节点,如果其磁盘利用率超过 90%,则被认为运行状态不佳。要确定哪些节点的磁盘利用率可能超过 90%,请执行以下操作:
1. 检查 Amazon CloudWatch 指标 MRUnhealthyNodes。这项指标表示运行状态不佳的 EMR 集群节点数量。
**注意:**您可以创建 CloudWatch 警报来监控 MRUnhealthyNodes 指标。
2. 连接到主节点并访问位于 /emr/instance-controller/log/instance-controller.log 的实例控制器日志。在实例控制器日志中,搜索 InstanceJointStatusMap 以确定哪些节点的运行状况不佳。
若要了解更多信息,请参阅如何解决 Amazon EMR 上 Spark 中的 ExecutorLostFailure "Slave lost" 错误?,并查看磁盘利用率高。
3. 登录到核心节点,然后运行以下命令来确定挂载是否有高利用率:
df -h
移除不必要的本地和临时 Spark 应用程序文件
在运行 Spark 任务时,Spark 应用程序会创建本地文件,这些文件会占用核心节点上的其余磁盘空间。例如,如果 df -h 命令显示 /mnt 正使用超过 90% 的磁盘空间,检查哪些目录或文件有高利用率。
在核心节点上运行以下命令,以查看正使用最多磁盘空间的 10 个目录:
cd /mnt
sudo du -hsx * | sort -rh | head -10
如果 /mnt/hdfs 目录有高利用率,请检查 HDFS 使用情况并移除任何不必要的文件,如日志文件等。缩短保留期有助于自动清理 HDFS 中的日志文件。
hdfs dfsadmin -report
hadoop fs -du -s -h /path/to/dir
缩短 Spark 事件和 YARN 容器日志的保留期
使用 HDFS 的常见原因是 /var/log 目录。/var/log 目录是存储 Spark 事件日志和 YARN 容器日志等日志文件的地方。您可以更改这些文件的保留期以节省空间。
以下示例命令会显示 /var/log/spark 使用情况。
注意:/var/log/spark 是默认的 Spark 事件日志目录。
hadoop fs -du -s -h /var/log/spark
缩短 Spark 作业历史文件的默认保留期
Spark 作业历史记录文件默认位于 /var/log/spark/apps 当中。当文件系统历史记录清理程序运行时,Spark 会删除七天前作业历史记录文件。要缩短默认保留期,请执行以下操作:
在正在运行的集群上:
1. 使用 SSH 连接到主节点。
2. 在 /etc/spark/conf/spark-defaults.conf 中添加或更新以下值。以下配置每隔 12 个小时会运行一次清理程序。配置会清除超过 1 天的文件。您可以在 spark.history.fs.cleaner.internval 和 spark.history.fs.cleaner.maxAge 参数中为您的单个使用案例自定义此时间范围。
------
spark.history.fs.cleaner.enabled true
spark.history.fs.cleaner.interval 12h
spark.history.fs.cleaner.maxAge 1d
------
3. 重新启动 Spark History Server。
在集群启动期间:
使用以下配置。您可以在 spark.history.fs.cleaner.internval 和 spark.history.fs.cleaner.maxAge 参数中为您的单个使用案例自定义时间范围。
{
"Classification": "spark-defaults",
"Properties": {
"spark.history.fs.cleaner.enabled":"true",
"spark.history.fs.cleaner.interval":"12h",
"spark.history.fs.cleaner.maxAge":"1d"
}
}
有关这些参数的更多信息,请参阅 Spark 文档中的监控和检测。
缩短 YARN 容器日志的默认保留期
Spark 应用程序日志是您的 Spark 作业的 YARN 容器日志,位于 /var/log/hadoop-yarn/apps 的核心节点上。Spark 会在应用程序完成运行后将这些日志移至 HDFS。默认情况下,YARN 会将应用程序日志在 HDFS 上保留 48 小时。要缩短保留期,请执行以下操作:
1. 使用 SSH 连接到主节点、核心节点或任务节点。
2. 在 Amazon EMR 集群中的每个节点(主节点,核心节点和任务节点)上打开 /etc/hadoop/conf/yarn-site.xml 文件。
3. 减少所有节点上的 yarn.log-aggregation.retain-seconds 属性的值。
4. 重新启动 ResourceManager 进程守护程序。有关更多信息,请参阅查看和重启 Amazon EMR 和应用程序进程。
您还可以重新配置集群来缩短保留期。有关更多信息,请参阅为正在运行的集群重新配置实例组。
减少使用 /mnt/yarn
如果 /mnt/yarn 目录的利用率高,请在节点上调整用户缓存保留期或扩展 EBS 卷。有关更多信息,请查阅如何防止 Hadoop 或 Spark 任务用户缓存在 Amazon EMR 中使用太多磁盘空间?
调整集群大小或扩展 Amazon EMR
添加更多核心节点以缓解 HDFS 空间问题。另外,如果非 HDFS 目录已满,请添加任何核心或任务节点。有关更多信息,请参阅扩展集群资源。
您还可以扩展现有节点中的 EBS 卷或使用动态扩展脚本。有关更多信息,请参阅以下内容:
相关信息
配置集群硬件和联网
HDFS 配置
使用存储和文件系统