【问题标题】:Kryo out of memoryKryo 内存不足
【发布时间】:2015-06-25 20:20:11
【问题描述】:

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

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)

我的驱动程序和执行程序都有 40GB 的可用 RAM。我尝试使用 Kryo 缓冲区大小/最大大小(从默认值一直增加到荒谬的值),但无济于事。

我做错了吗?这是一个知道的问题吗?有解决办法吗?

EDIT 尝试了 1.4.0 相同的问题。

附言这只发生在集群上。在本地,我正在让它成功运行。

总结

  1. 在本地使用或不使用 Kryo Serializer(虽然数据集较小),使用 1.3.1 和 1.4.0

  2. 在集群上,它使用默认的 Java 序列化程序,但在 1.3.1 和 1.4.0 上使用 Kryo 序列化程序失败,并显示相同的错误消息。

【问题讨论】:

  • 你有没有发现这些OOM错误的原因?
  • 不,但我认为它在 Spark 1.5.x 中消失了

标签: apache-spark kryo


【解决方案1】:

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

这可能是因为您的 Spark 任务非常大。如果您在 Scala 中编写了 Spark 作业,您可能会不小心将额外的对象拉入范围并膨胀您的作业大小。这是什么意思?

  1. 当您创建供 Spark 使用的 lambda 函数时,Spark 会查看 lambda 函数引用的所有对象
  2. Spark 然后将它们序列化并将它们与任务定义捆绑在一起。因此,如果您从 lambda 函数访问大型数据结构、外部类或全局变量,您可以轻松快速地将 Task 定义膨胀到大于 (2^31 - 1) 字节的程度。
  3. 然后,当 Kryo 尝试创建一个大于 (2^31 - 1) 的字节数组时,您看到的 OutOfMemoryException 将被抛出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 2011-05-21
    • 2021-12-20
    • 2021-10-29
    • 1970-01-01
    • 2020-03-12
    • 2015-08-11
    • 2019-06-07
    相关资源
    最近更新 更多