加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Spark:OutOfMemory尽管MEMORY_AND_DISK_SER

发布时间:2020-12-16 18:05:53 所属栏目:安全 来源:网络整理
导读:我写了一些代码来读取多个镶木地板文件并将它们缓存以供后续使用.我的代码看起来像这样简化了 val data = SparkStartup.sqlContext.read.parquet(...)data.setName(...).persist(StorageLevel.MEMORY_AND_DISK_SER).collect()map += data 镶木地板文件总共约
我写了一些代码来读取多个镶木地板文件并将它们缓存以供后续使用.我的代码看起来像这样简化了

val data = SparkStartup.sqlContext.read.parquet(...)
data.setName(...).persist(StorageLevel.MEMORY_AND_DISK_SER).collect()
map += data

镶木地板文件总共约11克.我配置我的应用程序:

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,如果使用太多内存,Spark会溢出到磁盘.但是,我得到`java.lang.OutOfMemoryError:Java堆空间错误

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倍.

解决方法

这是因为您在驱动程序应用程序中调用了collect().这将返回数据项的数组,这些数据项需要适合内存.

您应该使用数据RDD并将您的大量数据映射,减少,分组等转换为某些所需的结果,然后收集()那些较小量的数据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读