我有一个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个分区。这可能是错误的原因吗?
答案 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更复杂的操作)。