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

时间:2017-07-03 14:32:47

标签: r apache-spark pyspark sparklyr

我在java.io.IOException: No space left on device中运行简单查询后收到sparklyr。我使用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中尝试了类似的命令,它以同样的方式失败(同样的错误)。

通过查看Stages中的Spark标签,我发现当shuffle write约为60 GB时会发生错误。 (输入约为200GB)。鉴于我有足够的空间,这令人费解。我已经看过其他SO解决方案......

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

启动

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

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

这是什么问题? 谢谢!!

5 个答案:

答案 0 :(得分:6)

之前我曾多次遇到这个问题。背后的原因是临时文件。大多数服务器都有/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独立主机(正如我在您的问题中看到的)

我希望这会有所帮助

答案 1 :(得分:3)

更改magpie脚本中的以下设置

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

mypath前缀,而不是/tmp

答案 2 :(得分:2)

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

即使我遇到了类似的问题。设置此参数后,我重新启动了计算机,然后开始工作。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

本周我在独立模式群集上遇到了这个问题,在尝试了不同的事情之后,就像这个帖子中的一些建议一样,它最终成了一个名为&#34的子文件夹; work&#34;在Spark主文件夹内部长时间未经检查,从而填补了工作人员的职责空缺