我在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写入)
700K
(原始csv
个文件是100GB)它们本质上包含字符串。这是什么问题? 谢谢!!
答案 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主文件夹内部长时间未经检查,从而填补了工作人员的职责空缺