开发者社区> 问答> 正文

为什么这个Scala代码显然没有在Spark工作器上运行,而只在Spark驱动程序节点上运行?

社区小助手 2018-12-12 13:29:39 486

我使用这里提到的代码在Scala中创建一个HashMap。为方便起见,下面复制粘贴:

def genList(xx: String) = {

Seq("one", "two", "three", "four")

}

val oriwords = Set("hello", "how", "are", "you")

val newMap = (Map[String, (String, Int)]() /: oriwords) (

(cmap, currentWord) => {
  val xv = 2

  genList(currentWord).foldLeft(cmap) {
    (acc, ps) => {
      val src = acc get ps

      if (src == None) {
        acc + (ps -> ((currentWord, xv)))
      }
      else {
        if (src.get._2 < xv) {
          acc + (ps -> ((currentWord, xv)))
        }
        else acc
      }

    }
  }
}

)

println(newMap)
注意:上面的代码适用于较小的oriwords,但是,当oriwords它很大时它不起作用。显然是因为计算发生在Spark驱动程序节点上。

当我运行时,我得到了内存不足异常,如下所示:

WARN HeartbeatReceiver:66 - Removing executor driver with no recent heartbeats: 159099 ms exceeds timeout 120000 ms
Exception in thread "dispatcher-event-loop-1"
Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "dispatcher-event-loop-1"
Exception in thread "refresh progress" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
如何强制计算在Spark集群上发生并将生成的HashMap保存在Spark集群本身而不是计算并保存在Spark驱动程序节点上?

分布式计算 Java Scala Spark
分享到
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:20:07

    事件需要在RDD,数据集,Dataframe等为spark 分布你的计算。基本上所有的事情都发生在驱动程序上,除了那些在HoFs中发生的事件,比如map和foreach。

    0 0
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

推荐文章
相似问题