我有一个名为“edge”的大数据
org.apache.spark.rdd.RDD[org.apache.spark.graphx.Edge[(String, Int)]] = MappedRDD[27] at map at <console>:52
当我在独立模式下工作时,我能够收集,计算和保存此文件。现在,在群集上,我收到此错误
edges.count
...
Serialized task 28:0 was 12519797 bytes which exceeds spark.akka.frameSize
(10485760 bytes). Consider using broadcast variables for large values.
与.saveAsTextFile(“edges”)相同
这是来自spark-shell。我试过使用选项
--driver-java-options“-Dspark.akka.frameSize = 15”
但是当我这样做时,它只会无限期地挂起。任何帮助,将不胜感激。
**编辑**
我的独立模式是在Spark 1.1.0上,我的群集是Spark 1.0.1。
此外,当我计算,收集或保存作为RDD的时候会发生挂起,但是定义它或对其进行过滤可以正常工作。
答案 0 :(得分:9)
&#34;考虑对大值使用广播变量&#34;错误消息通常表示您已捕获函数闭包中的一些大变量。例如,您可能写过类似
的内容val someBigObject = ...
rdd.mapPartitions { x => doSomething(someBigObject, x) }.count()
导致someBigObject
被捕获并与您的任务序列化。如果您正在执行类似的操作,则可以使用broadcast variable代替,这将导致仅将对象的引用存储在任务本身中,而实际的对象数据将单独发送。 / p>
在Spark 1.1.0+中,为此使用广播变量并不是必需的,因为任务将自动广播(有关详细信息,请参阅SPARK-2521)。仍有理由使用广播变量(例如在多个操作/作业之间共享大对象),但您不会需要使用它来避免帧大小错误。
另一个选择是增加Akka帧大小。在任何Spark版本中,您应该能够在创建SparkContext之前在spark.akka.frameSize
中设置SparkConf
设置。然而,正如您可能已经注意到的那样,spark-shell
中的这个有点困难,其中为您创建了上下文。在较新版本的Spark(1.1.0及更高版本)中,您可以在启动--conf spark.akka.frameSize=16
时传递spark-shell
。在Spark 1.0.1或1.0.2中,您应该能够通过--driver-java-options "-Dspark.akka.frameSize=16"
。