我想了解Spark中collectAsMap的工作原理,具体来说,我想知道所有分区数据的聚合是在哪里进行的?在主节点还是在工作节点上进行。对于第一种情况,每个工作节点将其数据发送到主节点,当主节点从每个工作节点收集数据后,然后主节点将聚合结果进行合并。对于第二种情况,工作节点负责聚合结果(在它们之间交换数据之后),然后将结果发送给主节点。
重要的是,我需要找到一种方法,使主节点能够单独从每个分区收集数据,而不需要工作节点交换数据。
collect所做的就是执行Spark作业,并从工作程序获取每个分区的结果,并在驱动程序上进行减少/连接阶段进行聚合。
因此,鉴于这一点,驱动程序应该单独从每个分区收集数据,而无需工作程序交换数据来执行collectAsMap
。
collectAsMap
之前对RDD进行转换并导致洗牌发生,则可能会有一个中间步骤导致工作节点之间交换数据。请查看集群主节点的应用程序UI,以获取有关Spark如何执行您的应用程序的更多信息。支持上述答案:
collectAsMap()
- 将键值对作为字典返回(countByKey()
是另一个返回字典的函数)
collectAsMap()
、Collect()
、take(n)
、takeOrdered(n)
、takeSample(False,..)
这些方法会将所有数据带到驱动程序。程序员在生产环境中使用它们时需要注意。