首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星星之火: OutOfMemory尽管MEMORY_AND_DISK_SER

星星之火: OutOfMemory尽管MEMORY_AND_DISK_SER
EN

Stack Overflow用户
提问于 2015-09-21 13:46:08
回答 1查看 2.6K关注 0票数 4

我编写了一段代码,读取多个拼板文件,并将它们缓存以供以后使用。我的代码看起来像这样简化了

代码语言:javascript
复制
val data = SparkStartup.sqlContext.read.parquet(...)
data.setName(...).persist(StorageLevel.MEMORY_AND_DISK_SER).collect()
map += data

拼花文件总共约为11克。我通过以下方式配置应用程序:

代码语言:javascript
复制
 val sparkConfig = new SparkConf().setAppName(...).setMaster("local[128]")
sparkConfig.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
sparkConfig.set("spark.kryoserializer.buffer.max", "512m");
sparkConfig.set("spark.kryoserializer.buffer", "256");
sparkConfig.set("spark.driver.maxResultSize", "0");
sparkConfig.set("spark.driver.memory", "9g");

我认为通过使用MEMORY_AND_DISK_SER,如果使用过多的内存,火花就会溢出到磁盘上。但是,我得到了`java.lang.OutOfMemoryError: Java堆空间错误

代码语言:javascript
复制
at java.util.Arrays.copyOf(Arrays.java:3230)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
at com.esotericsoftware.kryo.io.Output.flush(Output.java:155)
at com.esotericsoftware.kryo.io.Output.require(Output.java:135)
at com.esotericsoftware.kryo.io.Output.writeAscii_slow(Output.java:446)
at com.esotericsoftware.kryo.io.Output.writeString(Output.java:306)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeName(DefaultClassResolver.java:105)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:81)
at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:472)

为什么会这样呢?我使用-Xmx9g -Dspark.executor.memory=9g -Dspark.executor.cores=3启动我的应用程序。对于所有崩溃前读取的文件,我可以在SparkUI中看到,当读取到内存中时,拼花文件的大小是其大小的9倍。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-21 13:58:55

这是因为在驱动程序应用程序中调用collect()。这将返回数据项的Array,需要将其放入内存中。

相反,您应该使用data RDD和映射、减少、分组等,将大量数据转换成一些所需的结果,然后将较小的数据量进行collect()处理。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32696926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档