我来自Hadoop背景,对Spark的了解有限。根据我到目前为止学到的东西,Spark没有mapper / reducer节点,而是有驱动程序/工作节点。 worker与mapper类似,驱动程序(不知何故)类似于reducer。因为只有一个驱动程序,所以会有一个减速器。如果是这样,那些非常大的数据集的单词计数如何简单可以在spark中完成?因为驱动程序可能只是内存不足。
答案 0 :(得分:12)
驱动程序更像是工作的控制器,只有在操作员要求时才将数据拉回来。如果您正在处理的操作员返回RDD / DataFrame / Unit,则数据仍然是分布式的。如果它返回一个原生类型,那么它确实会拉回所有数据。
否则,map和reduce的概念在这里有点过时(从一种工作的角度来看)。唯一真正重要的是操作是否需要数据随机播放。你可以通过UI或者通过toDebugString(每个缩进级别是一个shuffle)来分析舞台分组的洗牌点。
所有这一切,为了模糊的理解,你可以把任何需要洗牌的东西等同于减速器。否则它就是一个映射器。
最后,等同于你的字数例子:
sc.textFile(path)
.flatMap(_.split(" "))
.map((_, 1))
.reduceByKey(_+_)
在上面,这将在一个阶段完成,因为数据加载(textFile
),拆分(flatMap
)和map
ping都可以独立完成的数据。在调用reduceByKey
之前不需要随机播放,因为它需要组合所有数据来执行操作... HOWEVER ,此操作必须是关联的原因。每个节点将在本地执行reduceByKey
中定义的操作,仅合并后面的最终数据集。这减少了内存和网络开销。
注意 reduceByKey
返回RDD
因此为transformation
,因此数据通过HashPartitioner
进行洗牌。所有数据都不会回退到驱动程序,它只会移动到具有相同键的节点,以便它可以合并其最终值。
现在,如果您使用action
,例如reduce
或更糟糕的collect
,那么您将无法获得RDD
,这意味着数据会回归到司机,你需要它的空间。
Here is my fuller explanation of reduceByKey
if you want more。或者如何在combineByKey