火花: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 <- "/mypath/"
spark.worker.dir <- "/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 随机写入)
700K
(原始 csv
文件为 100GB)它们本质上包含字符串。
集群有 10 个节点,每个节点有 120GB RAM 和 20 个内核。
这里有什么问题? 谢谢!!
【问题讨论】:
您能否提供您正在使用的 spark 命令来显示什么是主模式和部署模式。这对您的情况很有帮助 我正在寻找您发出的spark-submit
命令,但我看到您正在使用其他方法来启动您的应用程序。所以问题变成了:你是如何设置spark.local.dir
和spark.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` <- "-Djava.io.tmpdir=/mypath"
【讨论】:
【参考方案5】:本周我在独立模式集群上遇到了这个问题,在尝试了不同的事情之后,就像这个线程中的一些建议一样,它最终成为 Spark 主文件夹中一个名为“work”的子文件夹,因为未选中同时填满工人的hhd
【讨论】:
以上是关于火花:java.io.IOException:设备上没有剩余空间[再次!]的主要内容,如果未能解决你的问题,请参考以下文章
java.io.IOException:Android 设备上没有剩余空间
java.io.IOException:流已重置:多个设备上的 REFUSED_STREAM
org.apache.hadoop.fs.FSError: java.io.IOException: 设备上没有空间 at org.apache.hadoop.fs.RawLocalFileSyste