Spark CollectAsMap

14
我想了解Spark中collectAsMap的工作原理,具体来说,我想知道所有分区数据的聚合是在哪里进行的?在主节点还是在工作节点上进行。对于第一种情况,每个工作节点将其数据发送到主节点,当主节点从每个工作节点收集数据后,然后主节点将聚合结果进行合并。对于第二种情况,工作节点负责聚合结果(在它们之间交换数据之后),然后将结果发送给主节点。

重要的是,我需要找到一种方法,使主节点能够单独从每个分区收集数据,而不需要工作节点交换数据。

在您的术语中,我认为您想说的是驱动程序而不是主节点。驱动程序是将收集结果汇总并从Spark集群发送的位置。 - Rich
3个回答

9
您可以在此处查看collectAsMap的使用情况。由于RDD类型是元组,因此它们似乎只是使用普通的RDD collect,然后将元组转换为键值对映射的地图。但是他们在评论中提到不支持多映射,因此您需要在数据上具有1对1的键/值映射。

collectAsMap函数

collect所做的就是执行Spark作业,并从工作程序获取每个分区的结果,并在驱动程序上进行减少/连接阶段进行聚合。

collect函数

因此,鉴于这一点,驱动程序应该单独从每个分区收集数据,而无需工作程序交换数据来执行collectAsMap

请注意,如果您在使用collectAsMap之前对RDD进行转换并导致洗牌发生,则可能会有一个中间步骤导致工作节点之间交换数据。请查看集群主节点的应用程序UI,以获取有关Spark如何执行您的应用程序的更多信息。

4
首先,在这两个操作中,RDD中所有的数据都将从不同的执行器/工作节点传输到主节点/驱动器。collect和collectAsMap只是将来自不同执行器/工作节点的数据汇总起来。因此,强烈建议仅在没有其他选择时才使用collect。
我必须说,从性能角度考虑,这是最后一个应该考虑的集合。
1. collect:将结果作为数组返回。 2. collectAsMap:将成对的RDD结果作为映射集合返回。由于它返回映射集合,您将仅获取具有唯一键的成对结果,并将删除具有重复键的成对结果。
祝好,
Neeraj

1

支持上述答案:

collectAsMap() - 将键值对作为字典返回(countByKey() 是另一个返回字典的函数)

collectAsMap()Collect()take(n)takeOrdered(n)takeSample(False,..)

这些方法会将所有数据带到驱动程序。程序员在生产环境中使用它们时需要注意。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接