我想知道collectAsMap在Spark中是如何工作的。更具体地说,我想知道所有分区的数据聚合将在何处发生?聚合发生在主人或工人中。在第一种情况下,每个工作人员在master上发送数据,当master从每个worker收集数据时,master将汇总结果。在第二种情况下,工人负责汇总结果(在他们之间交换数据之后),之后结果将被发送给主人。
我必须找到一种方法,以便主人能够分别从每个分区收集数据,而无需工人交换数据。
答案 0 :(得分:6)
您可以在此处查看他们如何进行collectAsMap。由于RDD类型是一个元组,看起来它们只是使用普通的RDD收集,然后将元组转换为键值对的映射。但他们在评论中确实提到不支持多地图,因此您需要在数据中进行一对一的键/值映射。
collect执行的操作是执行Spark作业并从工作程序中获取每个分区的结果,并使用驱动程序的reduce / concat阶段聚合它们。
因此,应该是驱动程序分别从每个分区收集数据而不需要工作人员交换数据来执行collectAsMap
的情况。
注意,如果您在使用collectAsMap
之前对RDD进行转换导致混乱发生,则可能存在一个中间步骤,导致工作人员之间交换数据。查看集群主机的应用程序UI,以查看有关如何执行应用程序的火花的更多信息。
答案 1 :(得分:2)
首先,在这两个操作中,RDD中存在的所有数据都将从不同的执行程序/工作程序传输到主服务器/驱动程序。 collect和collectAsMap都只会整理来自各种执行者/工作者的数据。这就是为什么总是建议不要使用收集,除非你没有任何其他选择。
我必须说,这是从性能的角度来看必须考虑的最后一个集合。
此致
Neeraj
答案 2 :(得分:0)
支持上述答案:
serverSide: true
- 返回键值对作为字典(collectAsMap()
是另一个返回字典的函数。)
countByKey()
,collectAsMap()
,Collect()
,take(n)
,takeOrdered(n)
这些方法将所有数据都带给驱动程序。程序员在生产中使用它们时需要预先进行预处理。