Apache spark Spark中的减速器概念

Apache spark Spark中的减速器概念,apache-spark,Apache Spark,我来自Hadoop背景,对Spark的了解有限。根据我到目前为止所了解的情况,Spark没有mapper/reducer节点,而是有驱动程序/工作程序节点。工人和制图员很相似,司机(不知何故)和减速器很相似。由于只有一个驱动程序,因此将有一个减速器。如果是这样的话,spark中如何完成像“超大数据集的字数统计”这样的简单程序?因为驱动程序可能会耗尽内存。驱动程序更像是工作的控制者,只有在操作员调用数据时才将其拉回来。如果您正在处理的操作符返回RDD/DataFrame/Unit,那么数据仍然是分

我来自Hadoop背景,对Spark的了解有限。根据我到目前为止所了解的情况,Spark没有mapper/reducer节点,而是有驱动程序/工作程序节点。工人和制图员很相似,司机(不知何故)和减速器很相似。由于只有一个驱动程序,因此将有一个减速器。如果是这样的话,spark中如何完成像“超大数据集的字数统计”这样的简单程序?因为驱动程序可能会耗尽内存。

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

否则,map和reduce的概念在这里就有点过时了(从一种工作角度来看)。唯一真正重要的是操作是否需要数据洗牌。您可以在UI中或通过toDebugString(其中每个缩进级别都是一个混洗)通过阶段拆分查看混洗点

尽管如此,对于模糊的理解,你可以将任何需要洗牌的东西等同于减速机。否则它就是地图绘制者

最后,与您的字数统计示例相同:

sc.textFile(path)
  .flatMap(_.split(" "))
  .map((_, 1))
  .reduceByKey(_+_)
在上面,这将在一个阶段中完成,因为数据加载(
textFile
)、拆分(
flatMap
)和
map
ping都可以独立于其余数据完成。在调用
reduceByKey
之前,不需要进行任何随机移动,因为它需要组合所有数据来执行操作…但是,由于某种原因,此操作必须是关联的。每个节点将在本地执行
reduceByKey
中定义的操作,仅合并之后的最终数据集。这减少了内存和网络开销

注意
reduceByKey
返回一个
RDD
,因此是一个
转换
,因此数据通过
HashPartitioner进行混洗。所有数据都不会返回到驱动程序,它只是移动到具有相同键的节点,以便合并其最终值

现在,如果您使用
操作
,例如
减少
,或者更糟糕的是,
收集
,那么您将不会得到
RDD
,这意味着数据会拉回到驱动程序,您需要空间来存储它


。或者这是如何在类似

的东西中分解的,Associative属性引入了HAdoop中的combiner之类的功能。但是,对于“reduceByKey”,数据需要被洗牌并发送到另一个工作节点?我们可以说worker节点扮演了reducer角色吗?这意味着我的第一个理解是正确的,因为在单词计数的情况下,我们有1M个唯一的单词。那么,所有这些独特的单词(连同它们的部分频率)都被转移到了驱动程序中,以便减少?换句话说,我们可以得出结论,Spark中有一个减速器,那就是驱动器?所有这些缩减都是在Hadoop中完成的(使用combiner)。等等,我不知何故忽略了reduceByKey是一种转换…在这种情况下,驱动程序不会获取所有数据…这就是为什么当您有键/值表示时会推送对函数…我更新了我的答案以指定…但是是的,工人是这个角色的还原者。@zero323有道理……如果你不接受答案,人们就会停止回答。。。。