繁体   English   中英

Spark:在RDD上收集/并行化比在RDD上“不执行任何操作”“更快”

[英]Spark: Collect/parallelize on RDD is “faster” than “doing nothing” on RDD

我正在尝试提高对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指南说:“收集:在驱动程序中将数据集的所有元素作为数组返回。通常在过滤器或其他操作返回足够小的数据子集之后,这很有用。”

顺便说一句:200k是否足够小

我觉得这段代码应该“更轻”(没有collect-parallelize):

  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秒。

这怎么可能?

提前致谢

我认为这是因为数据集太小,在后一种情况下,您需要安排随机排序来进行排序,而这种排序在本地操作时可能会更快。 当数据集增长时,甚至可能无法收集到驱动程序中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM