如何在Spark中执行每个执行程序的计算

时间:2018-01-08 10:46:59

标签: apache-spark jvm lazy-initialization

在我的计算中,我

  • 首先播放一些数据,比如bc
  • 然后计算所有执行者/分区共享的一些大数据:val shared = f(bc)
  • 然后使用共享数据运行分布式计算

为了避免计算所有RDD项目的shared数据,我可以使用.mapPartitions但是我有更多的分区而不是执行程序。因此,它运行共享数据的计算次数超过了必要的时间。

我找到了一个简单的方法来计算每个执行器只有一次共享数据(我理解的是实际运行spark任务的JVM):在广播数据上使用lazy val

// class to be Broadcast
case class BC(input: WhatEver){
  lazy val shared = f(input)
}

// in the spark code
val sc = ... // init SparkContext
val bc = sc.broadcast(BC(...))

val initRdd = sc.parallelize(1 to 10000, numSlices = 10000)
initRDD.map{ i =>
  val shared = bc.value.shared
  ... // run computation using shared data
}

我认为这符合我的要求,但

  1. 我不确定,有人能保证吗?
  2. 我不确定lazy val是管理并发访问的最佳方式,尤其是对于spark内部分发系统。还有更好的方法吗?
  3. 如果计算shared失败,我认为它将重新计算所有可能重试的RDD项目,而不是简单地用一个唯一错误停止整个作业。
  4. 那么,有更好的方法吗?

0 个答案:

没有答案