【问题标题】:how to deal with error SPARK-5063 in spark如何处理火花中的错误 SPARK-5063
【发布时间】:2015-07-01 04:36:26
【问题描述】:

我在 println 行中收到错误消息 SPARK-5063

val d.foreach{x=> for(i<-0 until x.length)
      println(m.lookup(x(i)))}    

d 是 RDD[Array[String]] m 是 RDD[(String, String)] 。有什么方法可以按照我想要的方式打印吗?或者我如何将 d 从 RDD[Array[String]] 转换为 Array[String]

【问题讨论】:

标签: scala apache-spark


【解决方案1】:

SPARK-5063 与尝试嵌套 RDD 操作时更好的错误消息相关,这是不支持的。

这是一个可用性问题,而不是功能问题。根本原因是 RDD 操作的嵌套,解决方法是打破它。

在这里,我们正在尝试 dRDDmRDD 的连接。如果mRDD 的大小很大,建议使用rdd.join,否则,如果mRDD 很小,即适合每个执行器的内存,我们可以收集它,广播它并做一个'map-side ' 加入。

加入

一个简单的连接应该是这样的:

val rdd = sc.parallelize(Seq(Array("one","two","three"), Array("four", "five", "six")))
val map = sc.parallelize(Seq("one" -> 1, "two" -> 2, "three" -> 3, "four" -> 4, "five" -> 5, "six"->6))
val flat = rdd.flatMap(_.toSeq).keyBy(x=>x)
val res = flat.join(map).map{case (k,v) => v}

如果我们想使用广播,我们首先需要在本地收集解析表的值,以便将其传递给所有执行者。 注意要广播的 RDD必须适合驱动程序和每个执行程序的内存。

Map-side JOIN 与广播变量

val rdd = sc.parallelize(Seq(Array("one","two","three"), Array("four", "five", "six")))
val map = sc.parallelize(Seq("one" -> 1, "two" -> 2, "three" -> 3, "four" -> 4, "five" -> 5, "six"->6)))
val bcTable = sc.broadcast(map.collectAsMap)
val res2 = rdd.flatMap{arr => arr.map(elem => (elem, bcTable.value(elem)))} 

【讨论】:

  • 这两种策略都会给出错误信息。第一个给出未找到的值:keyBy 和missing arguments for method identity in object Predef; follow this method with '_' if you want to treat it as a partially applied function。第二个给出类型不匹配,elem 应该是 String,但现在是 Array[String]。
  • 这就是问题所在。第一,加入一个作品。但第二个没有。当我尝试执行 foreach(println) 时,它会给出错误消息java.util.NoSuchElementException: key not found: null。但是我可以用第一种方法得到结果,所以它应该能够找到键。
  • 我在 spark shell 上测试过 - 有什么问题?至少,你明白了吗?
  • 我明白了。并且对广播的概念有点困惑。
  • @G_cy 广播是对序列化的优化。通过序列化,Spark 需要序列化映射,并将每个任务分派给执行器。使用广播,同样可以通过每个执行器仅序列化一次地图来实现,但一般来说,它的“您与作业一起发送给执行器的数据”
【解决方案2】:

RDD 缺少SparkContext。它可能发生在以下情况:

RDD 驱动程序不会调用转换和操作,

但在其他内部 转变;例如,rdd1.map(x =&gt; rdd2.values.count() * x) 无效 因为不能在内部执行值转换和count 操作 rdd1.map转型

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多