Spark中的减速机概念

时间:2015-07-31 16:58:55

标签: apache-spark

我来自Hadoop背景,对Spark的了解有限。根据我到目前为止学到的东西,Spark没有mapper / reducer节点,而是有驱动程序/工作节点。 worker与mapper类似,驱动程序(不知何故)类似于reducer。因为只有一个驱动程序,所以会有一个减速器。如果是这样,那些非常大的数据集的单词计数如何简单可以在spark中完成?因为驱动程序可能只是内存不足。

1 个答案:

答案 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

之类的内容中出现问题