如何解决 Amazon EMR 上 Spark 中的“no space left on device”(设备上没有剩余空间)阶段故障?

上次更新日期:2022 年 1 月 31 日

我向 Amazon EMR 集群提交了 Apache Spark 应用程序。应用程序出现故障,出现“no space left on device”(设备上没有剩余空间)阶段故障,如下所示:

任务因阶段故障而中止:阶段 8.0 中的任务 31 失败 4 次,最近一次失败:任务 31.3 在阶段 8.0 丢失(TID 2036,ip-xxx-xxx-xx-xxx.compute.internal,执行器 139):org.apache.spark.spark.collection.unsafe.spark.memoryError:在 org.apache.park.util.collection.unsafe.unsafe.上调用 spill () 时出错 .sort。unsafeExternalSorter @1a698b89:设备上没有剩余空间

简短描述

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)实例类型。有关为每种实例类型分配的存储量和卷数量的更多信息,请参阅实例的默认 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.xmlyarn.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)

这篇文章对您有帮助吗?


您是否需要账单或技术支持?