Apache spark 火花内存不足错误

Apache spark 火花内存不足错误,apache-spark,out-of-memory,Apache Spark,Out Of Memory,我的spark程序在小数据集(约400GB)上运行良好 然而,当我将其扩展到大型数据集时。我开始得到错误java.lang.OutOfMemoryError:java堆空间或java.lang.OutOfMemoryError:请求的数组大小超过VM限制 我的程序是这样的: sc.textFile->map->filter->groupBy->saveAsObjectFile groupBy生成RDD[(int,可迭代[A])类型的结果 错误发生在saveAsObjectFile中。 我能想到的

我的spark程序在小数据集(约400GB)上运行良好 然而,当我将其扩展到大型数据集时。我开始得到错误
java.lang.OutOfMemoryError:java堆空间
java.lang.OutOfMemoryError:请求的数组大小超过VM限制

我的程序是这样的: sc.textFile->map->filter->groupBy->saveAsObjectFile

groupBy
生成RDD[(int,可迭代[A])类型的结果

错误发生在
saveAsObjectFile
中。 我能想到的唯一原因是: 在
groupBy
步骤中,某些键包含太大的数据。 但是我用蜂巢检查了所有的钥匙,最大的是33008。 A类也不是很大

我的配置是: -驱动程序内存20G--num executors 120--executor内存30G Spark版本:1.4

15/07/03 07:05:06 ERROR ActorSystemImpl: Uncaught fatal error from thread 
[sparkDriver-akka.remote.default-remote-dispatcher-5] shutting down ActorSystem [sparkDriver]
java.lang.OutOfMemoryError: Java heap space
        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.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876)
        at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1785)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1188)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
        at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply$mcV$sp(Serializer.scala:129)
        at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:129)
        at akka.serialization.JavaSerializer$$anonfun$toBinary$1.apply(Serializer.scala:129)
        at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
        at akka.serialization.JavaSerializer.toBinary(Serializer.scala:129)
        at akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:36)
        at akka.remote.EndpointWriter$$anonfun$serializeMessage$1.apply(Endpoint.scala:845)
        at akka.remote.EndpointWriter$$anonfun$serializeMessage$1.apply(Endpoint.scala:845)
        at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
        at akka.remote.EndpointWriter.serializeMessage(Endpoint.scala:844)
        at akka.remote.EndpointWriter.writeSend(Endpoint.scala:747)
        at akka.remote.EndpointWriter$$anonfun$2.applyOrElse(Endpoint.scala:722)
        at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
        at akka.remote.EndpointActor.aroundReceive(Endpoint.scala:415)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
        at akka.actor.ActorCell.invoke(ActorCell.scala:487)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
        at akka.dispatch.Mailbox.run(Mailbox.scala:220)

驱动程序OutOfMemory的快速解决方案是使用“spark.driver.memory”属性增加驱动程序内存

下面的文章可能有助于驱动程序和执行器的内存分配

还要注意
GroupByKey
是成本更高的操作。所以尽量避免使用reduceByKey


您的作业可能是不平衡的,所以一些分区会获得很多键(及其值)。您可以尝试添加更多分区和/或编写自定义分区器,根据您对数据的了解来平衡分区

这是来自驱动程序还是执行程序的错误消息?@VijayInnamuri问题已更新。似乎来自于司机。但哪一步可能导致如此巨大的内存。我已经给它20克了