火花:java.io.IOException:设备上没有剩余空间[再次!]

Posted

技术标签:

【中文标题】火花:java.io.IOException:设备上没有剩余空间[再次!]【英文标题】:spark: java.io.IOException: No space left on device [again!] 【发布时间】:2017-12-06 21:05:45 【问题描述】:

sparklyr 中运行一个简单查询后,我得到了java.io.IOException: No space left on device。我使用Spark (2.1.1) 和Sparklyr 的最新版本

df_new <-spark_read_parquet(sc, "/mypath/parquet_*", name = "df_new", memory = FALSE)

myquery <- df_new %>% group_by(text) %>% summarize(mycount = n()) %>% 
  arrange(desc(mycount)) %>% head(10)

#this FAILS
get_result <- collect(myquery)

我都设置了

spark.local.dir &lt;- "/mypath/" spark.worker.dir &lt;- "/mypath/"

正常使用

config <- spark_config()

config$`spark.executor.memory` <- "100GB"
config$`spark.executor.cores` <- "3"
config$`spark.local.dir` <- "/mypath/"
config$`spark.worker.dir` <- "mypath/"
config$`spark.cores.max`<- "2000"
config$`spark.default.parallelism`<- "4"
config$`spark.total-executor-cores`<- "80"
config$`sparklyr.shell.driver-memory` <- "100G"
config$`sparklyr.shell.executor-memory` <- "100G"
config$`spark.yarn.executor.memoryOverhead` <- "100G"
config$`sparklyr.shell.num-executors` <- "90"
config$`spark.memory.fraction` <- "0.2"

  Sys.setenv(SPARK_HOME="mysparkpath")
  sc <- spark_connect(master = "spark://mynode", config = config)

mypath 的磁盘空间超过 5TB(我可以在Environment 选项卡中看到这些选项)。我在Pyspark 中尝试了类似的命令,但以同样的方式失败(同样的错误)。

通过查看Spark 中的Stages 选项卡,我发现当shuffle write 大约为60 GB 时会发生错误。 (输入大约是200GB)。考虑到我有足够的可用空间,这令人费解。我已经看过其他 SO 解决方案了......

集群作业用magpie启动 https://github.com/LLNL/magpie/blob/master/submission-scripts/script-sbatch-srun/magpie.sbatch-srun-spark

每次我启动 Spark 作业时,我都会在我的 /mypath 文件夹中看到一个名为 spark-abcd-random_numbers 的目录。但是那里的文件非常小(远不及 60GB 随机写入)

大约有 40 个镶木地板文件。每个都是 700K(原始 csv 文件为 100GB)它们本质上包含字符串。 集群有 10 个节点,每个节点有 120GB RAM 和 20 个内核。

这里有什么问题? 谢谢!!

【问题讨论】:

您能否提供您正在使用的 spark 命令来显示什么是主模式和部署模式。这对您的情况很有帮助 我正在寻找您发出的spark-submit 命令,但我看到您正在使用其他方法来启动您的应用程序。所以问题变成了:你是如何设置spark.local.dirspark.worker.dir 属性的?您可以访问集群的 spark 配置文件吗? 您可以在作业运行时使用手表“df -u”检查哪个磁盘已满?是根卷吗?然后我会检查什么样的文件正在填充它 @Noobie,关键是要找出哪个磁盘已满以及原因。 watch 命令通常会每隔一段时间执行一次子命令(默认每 2 秒一次,你可以控制它...) @Noobie,我唯一的想法 - 也许你正在使用 sparkR shell 或其他东西(?我没有使用它)并且你把你的应用程序放在这个 shell 中,所以真正有效的是配置 shell 而不是你提供的 spark 配置...你已经得到了重启机器的建议,但是如果你有 spark-slave 进程(CoarseGrained 的东西,尝试用 ps -ef 查找) - 你可以先重启它.我们已经讨论过 dir - 您使用的是 spark 本地上下文吗?它是您唯一使用的机器吗? 【参考方案1】:

我以前多次遇到过这个问题。背后的原因是临时文件。大多数服务器都有一个非常小的/tmp/ 分区,这是 spark 的默认临时目录。 通常,我曾经通过在spark-submit 命令中设置如下来更改它:

$spark-submit --master local[*] --conf "spark.driver.extraJavaOptions=-Djava.io.tmpdir=/mypath/" ....

在您的情况下,我认为您可以将其提供给 R 中的配置,如下所示(我尚未测试过,但应该可以):

config$`spark.driver.extraJavaOptions` <- "-Djava.io.tmpdir=/mypath/"
config$`spark.executor.extraJavaOptions ` <- "-Djava.io.tmpdir=/mypath/"

请注意,您必须为驱动程序和执行程序更改它,因为您使用的是 Spark 独立主机(正如我在您的问题中看到的那样) 我希望这会有所帮助

【讨论】:

仍然收到错误...该选项在“环境”选项卡中显示为spark.executor.extraJavaOptions -Djava.io.tmpdir=/mypath。对吗? 我使用的config$spark.worker.dir` 选项是正确的,它们既适用于驱动程序又适用于执行程序,因此您还应该有 spark.driver.extraJavaOptions -Djava.io.tmpdir=/mypath 。工作目录的区别是一个 spark 选项,其中设置 java.io.tmpdir 管理 spark 的 java 进程,并将覆盖 spark 中的所有属性 我正在查看 sparklyr 文档,没有理由不考虑配置。我会试着找出解决这个问题的方法 我刚刚看到你的更新,因为你正在使用 magpie 脚本,所以有机会在脚本上添加这些配置:github.com/LLNL/magpie/blob/master/submission-scripts/…。在这里你可以添加export SPARK_JOB_JAVA_OPTS="-Djava.io.tmpdir=/mypath/"。不要忘记通过删除标题 # 取消注释此行【参考方案2】:

在你的 magpie 脚本中更改以下设置

export MAGPIE_LOCAL_DIR="/tmp/$USER/magpie" 
export SPARK_LOCAL_DIR="/tmp/$USER/spark"

mypath前缀而不是/tmp

【讨论】:

我需要保留user/magpie 的东西吗? 这是你的决定,但我会照原样说,所以会有明显的区别【参考方案3】:

设置好参数后,您可以在 Spark 环境 UI 中看到 spark.local.dir 的新值。但是没有反映。

即使我也遇到了类似的问题。设置好这个参数后,我重启了机器,然后就开始工作了。

【讨论】:

你重启机器是什么意思?每次运行作业时都无法重新启动机器 在 spark-defaults.conf 文件中设置这些参数并重启服务器。那么就不需要从外部传递这些参数了。 如果是这种情况,请尝试在网关机器中设置并检查一次。【参考方案4】:

由于需要在通过spark-submit 启动JVM 时进行设置,因此需要使用sparklyr java-options,例如

config$`sparklyr.shell.driver-java-options` &lt;- "-Djava.io.tmpdir=/mypath"

【讨论】:

【参考方案5】:

本周我在独立模式集群上遇到了这个问题,在尝试了不同的事情之后,就像这个线程中的一些建议一样,它最终成为 Spark 主文件夹中一个名为“work”的子文件夹,因为未选中同时填满工人的hhd

【讨论】:

以上是关于火花:java.io.IOException:设备上没有剩余空间[再次!]的主要内容,如果未能解决你的问题,请参考以下文章

java.io.IOException:文件系统已关闭

java.io.IOException:Android 设备上没有剩余空间

java.io.IOException:流已重置:多个设备上的 REFUSED_STREAM

为什么使用错误的Java版本进行火花提交

org.apache.hadoop.fs.FSError: java.io.IOException: 设备上没有空间 at org.apache.hadoop.fs.RawLocalFileSyste

android java.io.IOException:传输端点未连接