[英]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.