为什么Spark失败了"无法获得broadcast_0"的broadcast_0_piece0?在本地模式?

时间:2015-12-24 20:08:50

标签: java scala intellij-idea apache-spark scalatest

我正在运行此代码段来对点的RDD进行排序,对RDD进行排序并从给定点获取K-最近点:

echo preg_replace("/<\\?xml.*\\?>/",'',$doc->saveXML(),1);

}

在我的应用程序中只使用一个SparkContext并将其作为参数传递给我的函数,我在调用def getKNN(sparkContext:SparkContext, k:Int, point2:Array[Double], pointsRDD:RDD[Array[Double]]): RDD[Array[Double]] = { val tuplePointDistanceRDD:RDD[(Double, Array[Double])] = pointsRDD.map(point => (DistanceUtils.euclidianDistance(point, point2), point)) sparkContext.parallelize(tuplePointDistanceRDD.sortBy(_._1).map(_._2).take(k)) org.apache.spark.SparkException: Failed to get broadcast_0_piece0 of broadcast_0获取KNN点时出现sparkContext.parallelize(tuplePointDistanceRDD.sortBy(_._1).map(_._2).take(k))错误{1}}。

我正在构建point2,如下面的代码段:

sparkContext

面对这种错误的可能原因是什么?

基本上这是我的独立spark环境的LOG,其中包含此错误的堆栈跟踪:

var sparkContext = new SparkContext("local", "<app_name>")

5 个答案:

答案 0 :(得分:5)

刚刚发现为什么我收到此异常:由于某种原因,SparkContext对象在ScalaTest方法之间多次启动/停止。所以,修正这种行为会让我以正常的方式获得火花。

答案 1 :(得分:2)

我也遇到了这个错误。我还没有看到任何具体的编码示例,所以我将分享我的解决方案。这清除了我的错误,但我感觉这个问题可能有多个解决方案。但这值得一试,因为它将所有内容保存在代码中。

看起来SparkContext正在关闭,从而引发了错误。我认为问题是SparkContext是在类中创建的,然后扩展到其他类。扩展导致它关闭,这有点烦人。下面是我用来清除此错误的实现。

Spark初始化类:

import org.apache.spark.{SparkConf, SparkContext}

class Spark extends Serializable {
  def getContext: SparkContext = {
    @transient lazy val conf: SparkConf = 
          new SparkConf()
          .setMaster("local")
          .setAppName("test")

    @transient lazy val sc: SparkContext = new SparkContext(conf)
    sc.setLogLevel("OFF")

   sc
  }
 }

主类:

object Test extends Spark{

  def main(args: Array[String]): Unit = {
  val sc = getContext
  val irisRDD: RDD[String] = sc.textFile("...")
...
}

然后用Spark类扩展你的另一个类,它应该都可以解决。

我收到了运行LogisticRegression模型的错误,因此我认为这应该为您以及其他机器学习库修复它。

答案 2 :(得分:1)

我也面临同样的问题。经过大量的谷歌搜索后,我发现我为SparkContext初始化创建了一个单例类,它只对单个JVM实例有效,但是在Spark的情况下,这个单例类将从在单独的JVM实例上运行的每个工作节点调用,因此导致到多个SparkContext对象。

答案 3 :(得分:1)

对我来说有帮助,因为SparkContext已经创建了

val sc = SparkContext.getOrCreate()

在我尝试使用此之前

val conf = new SparkConf().setAppName("Testing").setMaster("local").set("spark.driver.allowMultipleContexts", "true")
val sc = SparkContext(conf)

但是当我跑步时它被打破了

 spark.createDataFrame(rdd, schema)

答案 4 :(得分:1)

与上述答案有关,当我无意中将datastax连接器(即Cassandra连接驱动程序)查询序列化到Spark Slave时遇到了这个问题。然后将其拆分为自己的SparkContext,并在4秒钟内整个应用程序崩溃了