Spark中的减速机概念

HHH*_*HHH 8 apache-spark

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

Jus*_*ony 14

驱动程序更像是工作的控制器,只有在操作员要求时才撤回数据.如果您正在处理的运算符返回RDD/DataFrame/Unit,则数据仍然是分布式的.如果它返回一个本机类型,那么它确实会将所有数据拉回来.

否则,map和reduce的概念在这里有点过时(从一种工作的角度来看).唯一真正重要的是操作是否需要数据随机播放.你可以通过UI或者通过toDebugString(每个缩进级别是一个shuffle)来分析舞台分组的洗牌点.

所有这一切,对于模糊的理解,你可以把任何需要洗牌的东西等同于减速器.否则它是一个映射器.

最后,等同于您的单词计数示例:

sc.textFile(path)
  .flatMap(_.split(" "))
  .map((_, 1))
  .reduceByKey(_+_)
Run Code Online (Sandbox Code Playgroud)

在上面,这将在一个阶段完成,因为数据loading(textFile),splititting(flatMap)和mapping都可以独立于其余数据完成.reduceByKey调用之前不需要随机播放,因为它需要组合所有数据来执行操作...... 但是,此操作必须是关联的原因.每个节点将执行reduceByKey本地定义的操作,仅合并后的最终数据集.这减少了内存和网络开销.

注意,reduceByKey返回an RDD并因此是a transformation,因此数据通过a进行洗牌HashPartitioner.所有数据都不会回退到驱动程序,它只会移动到具有相同键的节点,以便它可以合并其最终值.

现在,如果你使用了action这样reduce或更糟糕的collect,那么你将不会得到一个RDD后退,这意味着数据会回到驱动程序,你将需要它的空间.

这是我更全面的解释,reduceByKey如果你想要更多.或者这是如何分解的combineByKey