首页
学习
活动
专区
圈层
工具
发布

Kryo失忆
EN

Stack Overflow用户
提问于 2015-06-25 20:20:11
回答 1查看 1.7K关注 0票数 2

无论我尝试了什么,在使用Kryo序列化程序时,我都会使用Spark1.3.1获得这个OOME (如果我使用默认的Java,我没有任何问题)

代码语言:javascript
复制
15/06/25 20:16:37 WARN TaskSetManager: Lost task 47.0 in stage 1.0 (TID 59, ip-172-31-28-175.ec2.internal): java.lang.OutOfMemoryError: Requested array size exceeds VM limit
        at java.util.Arrays.copyOf(Arrays.java:2271)
        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.write(BufferedOutputStream.java:122)
        at com.ning.compress.lzf.ChunkEncoder.encodeAndWriteChunk(ChunkEncoder.java:264)
        at com.ning.compress.lzf.LZFOutputStream.writeCompressedBlock(LZFOutputStream.java:266)
        at com.ning.compress.lzf.LZFOutputStream.write(LZFOutputStream.java:124)
        at com.esotericsoftware.kryo.io.Output.flush(Output.java:155)
        at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:31)
        at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:27)
        at scala.collection.immutable.List.foreach(List.scala:318)
        at com.twitter.chill.TraversableSerializer.write(Traversable.scala:27)
        at com.twitter.chill.TraversableSerializer.write(Traversable.scala:21)
        at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
        at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
        at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
        at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
        at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
        at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
        at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
        at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:29)
        at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:27)
        at scala.collection.immutable.List.foreach(List.scala:318)
        at com.twitter.chill.TraversableSerializer.write(Traversable.scala:27)
        at com.twitter.chill.TraversableSerializer.write(Traversable.scala:21)
        at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
        at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
        at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
        at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
        at org.apache.spark.serializer.KryoSerializationStream.writeObject(KryoSerializer.scala:124)
        at org.apache.spark.serializer.SerializationStream.writeAll(Serializer.scala:110)

我在驱动程序和执行器上都有40 of的RAM可用。我试着使用Kryo缓冲区大小/最大大小(从默认到可笑的值),但都没有效果。

我做错了什么吗?这是个众所周知的问题吗?有解决办法吗?

编辑尝试了1.4.0相同的问题。

附注:这种情况只发生在集群上。在当地,我正在使它成功地发挥作用。

总而言之

  1. 在本地,它使用或不使用Kryo序列化程序(但数据集较小),使用1.3.1和1.4.0
  2. 在集群上,它使用默认的Java序列化程序,但在1.3.1和1.4.0上使用具有相同错误消息的Kryo序列化程序失败。
EN

回答 1

Stack Overflow用户

发布于 2018-03-04 01:59:22

这个错误有点用词不当。这并不意味着您的机器没有足够的内存,这意味着Kryo试图创建一个具有(2^31 -1)多个元素的字节数组。

这可能是因为您的星火任务相当大。如果您用Scala编写了星火作业,您可能会意外地将额外的对象拖到范围内,并增大作业的大小。我这么说是什么意思?

  1. 当您创建一个由星火使用的lambda函数时,Spark将查看lambda函数所引用的所有对象
  2. Spark然后序列化它们并将它们与任务定义捆绑在一起。因此,如果从lambda函数访问大型数据结构、外部类或全局变量,则可以轻松地将任务定义膨胀到大于(2^31 - 1)字节的程度。
  3. 然后,当Kryo试图使字节数组大于(2^31 - 1)时,您看到的OutOfMemoryException将被抛出。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31060038

复制
相关文章

相似问题

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