我正在努力改进我的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秒。
这怎么可能?
提前致谢
答案 0 :(得分:1)
我认为这是因为数据集太小,在后一种情况下,您遇到了shuffle的调度,以便在本地操作时进行更快的排序。当数据集增长时,甚至可能无法收集到驱动程序中。