Spark广播错误:超过spark.akka.frameSize考虑使用广播

时间:2014-11-30 21:30:23

标签: scala apache-spark rdd

我有一个名为“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的时候会发生挂起,但是定义它或对其进行过滤可以正常工作。

1 个答案:

答案 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"