Spark:在RDD上收集/并行化RDD比“无所事事”更“快”

时间:2015-05-12 15:51:59

标签: performance scala apache-spark rdd collect

我正在努力改进我的Spark应用程序代码理解“收集”,我正在处理这段代码:

  val triple = logData.map(x => x.split('@'))
                  .map(x => (x(1),x(0),x(2)))
                  .collect()
                  .sortBy(x => (x._1,x._2))
  val idx = sc.parallelize(triple)

基本上我正在使用不必要的(imho)收集/并行化步骤(原始RDD中的200k元素)创建[String,String,String] RDD。

Spark指南说:“收集:在驱动程序中将数据集的所有元素作为数组返回。这通常在过滤器或其他操作返回足够小数据子集。“

BTW:200k 足够小

我觉得这段代码应该“更轻”(没有收集并行化):

  val triple = logData.map(x => x.split('@'))
                  .map(x => (x(1),x(0),x(2)))
                  .sortBy(x => (x._1,x._2))
  val idx = triple

但是在多次运行(本地未分发)相同的应用程序之后,我总是使用第一个代码获得更快的时间,在我看来,这是一个额外的工作(首先收集然后并行化)。

整个应用程序(不仅仅是这段代码片段)在第一种情况下平均需要48秒,在第二种情况下至少需要52秒。

这怎么可能?

提前致谢

1 个答案:

答案 0 :(得分:1)

我认为这是因为数据集太小,在后一种情况下,您遇到了shuffle的调度,以便在本地操作时进行更快的排序。当数据集增长时,甚至可能无法收集到驱动程序中。