spark groupby驱动程序抛出OutOfMemory

时间:2015-07-16 05:31:38

标签: apache-spark

我有一个RDD [((Long,Long),Float)]大约150G(显示在web ui存储中)。 当我groupby这个RDD时,驱动程序会抛出以下错误

15/07/16 04:37:08 ERROR actor.ActorSystemImpl: Uncaught fatal error from thread [sparkDriver-akka.remote.default-remote-dispatcher-39] 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)

执行者甚至没有开始上演。

此RDD有120000个分区。这可能是错误的原因吗?

2 个答案:

答案 0 :(得分:0)

至少一个分区的大小多于您分配给执行程序的内存(您可以在运行spark作业的命令行上使用--executor-memory标志执行此操作

答案 1 :(得分:0)

按(长,长)分组后,至少有一个组很大,以适应内存。 Spark希望分组后的每条记录((Long,long),Iterator [Float])都适合内存。而这不是您的数据的情况。请参阅此https://spark.apache.org/docs/1.2.0/tuning.html查找减少任务的内存使用情况

我建议通过增加数据并行性来解决问题。在分组之前添加映射步骤并分解数据。

ds.Map(x =>(x._1._1,x._1._2,x._1._1%2),float))

然后按新键分组(您可能会执行比此x._1._1%2更复杂的操作)。