如何仅发送一次收藏来激发节点一次



考虑以前问题的简单代码:最简单程序的大任务尺寸

import org.apache.spark.{SparkContext, SparkConf}
object LargeTaskTest {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("DataTest").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val dat = (1 to 10000000).toArray
    val data = sc.parallelize(dat).cache()
    for(i <- 1 to 100){
      println(data.sum)
    }
  }   
}

我本质上也有同样的问题:如何摆脱每次迭代的"大型警告"的任务?

接受的解决方案建议使用flatMap并行创建数据。尽管这是整数范围的一个很好的解决方案,但如果我的数据实际上是我无法并行创建的对象集合(来自程序中的其他位置)?

我了解是否需要将数据运送到所有导致任务大小的节点上。对于随后的操作,无法重复使用已被关注的数据吗?

事先感谢您的帮助。

一般解决方案:不要使用sc.parallelize。这并不是特别有效地实现,因为它确实用于教学/调试,以及一些实际用例,例如并行化文件名(小)和读取RDD地图关闭中的文件。

在这种情况下,您可以通过不将Range(O(1)内存足迹)转换为Array(O(o(n)内存足迹))来大大减少任务的大小。只需删除toArray,您就不应再次收到这些警告。

我已经接受了蒂姆的答案:不要使用 sc.parallelize。为了支持他的主张,以以下方式创建RDD解决了数据复印问题。

val pw = new java.io.PrintWriter("tmp")
(1 to 10000000).foreach(pw.println)
pw.close()
val data = sc.textFile("tmp").map(_.toDouble).persist()

最新更新