关于Spark分布聚合的一个问题

55ooxyrt  于 2023-01-13  发布在  Apache
关注(0)|答案(1)|浏览(124)

我正在阅读here中的spark
有一次,博客上写道:
假设有一个应用程序希望对语料库中每个单词的出现次数进行计数,并将结果作为Map拉入驱动程序。一种方法是在每个分区计算本地Map,然后在驱动程序中合并Map,这种方法可以使用aggregateByKey实现。另一种方法是以完全分布式的方式执行计数,然后简单地将结果collectAsMap到驱动程序。
因此,根据我的理解,所描述的两种方法是:
方法一:
1.在每个执行器中为创建散列Map
1.从驱动程序上的所有执行器收集密钥1并进行聚合
1.从驱动程序上的所有执行器收集密钥2并进行聚合
等等等等
这就是问题所在,我不认为这种方法1会出现在spark中,除非用户下定决心要这么做,并开始使用collect和filter在驱动程序上逐个键地获取数据,然后在驱动程序上编写代码来合并结果
方法2(我认为这是在spark中经常发生的事情,除非你使用groupBy,其中合并器不运行。这是典型的reduceBy机制):
1.在Map端计算第一级聚合

  1. Shuffle
    1.根据步骤1中的所有部分聚合结果计算第二级聚合
    这使我相信我误解了方法1和作者想说的话。你能帮助我理解引用文本中的方法1是什么吗?
yacmzcpb

yacmzcpb1#

  • 编者按,2021年1月:这篇博客文章仅供参考。它涵盖了Spark 1.3,这是一篇自2015年发表以来已经过时的版本。要了解这一主题的现代观点,请务必阅读我们最近关于Apache Spark 3.0性能的文章。*

也许(我只是猜测!)桑迪Ryza先生指的是RDD的reduceByKeyLocally函数,它返回Map到驱动程序,然后执行自己选择的一些reduce函数。但是很难确定,因为您的文章是10年前写的...

相关问题