为了更好地理解Spark作业的性能调优,我假设groupByKey
, map
, flatMap
, cartesian
等方法在底层使用了map reduce设计模式。
我问这个问题的原因是为了更好地理解Spark是如何工作的,从而编写出性能更高的Spark Scala代码。
Spark将RDD上的操作分为两大类:转换和操作。
-
转换:将一个分布式数据结构转换为另一个分布式数据结构。转换包括如下操作:map、flatmap、filter、groupByKey。完整列表见spark转换函数
-
Actions: Actions强制收集值并将结果返回给作业驱动程序。
所有转换函数都是惰性的,当需要它们持有的值时,它们将以分布式的方式跨spark worker执行。由转换链形成的有向无环图(DAG)称为给定RDD的"谱系"。操作将把数据从分布式RDD(工人)输送到驱动程序。
简而言之,是的,它们遵循类似map-reduce的分布式计算模型,有两个主要区别:(1)转换是懒惰的:直到需要时才计算;(2)可重用性:以RDD(弹性分布式数据集)形式转换的数据可以被重用以进一步映射或减少转换。
要深入了解Spark的分布式计算模型是如何工作的,我建议您阅读这篇论文:弹性分布式数据集:内存集群计算的容错抽象