Spark CollectAsMap

Posted

技术标签:

【中文标题】Spark CollectAsMap【英文标题】: 【发布时间】:2015-06-30 13:56:36 【问题描述】:

我想知道 collectAsMap 在 Spark 中的工作原理。更具体地说,我想知道所有分区的数据聚合将发生在哪里?聚合发生在 master 或 worker 中。在第一种情况下,每个工作人员将其数据发送到主服务器,当主服务器从每个工作人员收集数据时,主服务器将汇总结果。在第二种情况下,工人负责汇总结果(在他们之间交换数据之后),然后将结果发送给主节点。

找到一种方法对我来说至关重要,以便 master 能够分别从每个分区收集数据,而无需工作人员交换数据。

【问题讨论】:

用你的术语我认为你的意思是说司机而不是大师。驱动程序是收集结果将从 Spark 集群聚合和发送的地方。 【参考方案1】:

你可以在这里看到他们是如何做 collectAsMap 的。由于 RDD 类型是一个元组,看起来他们只是使用普通的 RDD 收集然后将元组转换为键值对的映射。但他们确实在评论中提到不支持多映射,因此您需要跨数据进行一对一的键/值映射。

collectAsMap function

collect 的作用是执行一个 Spark 作业,并从工作人员那里取回每个分区的结果,并在驱动程序上通过 reduce/concat 阶段聚合它们。

collect function

因此,应该是驱动程序分别从每个分区收集数据,而不需要工作人员交换数据来执行collectAsMap

注意,如果您在使用 collectAsMap 之前对您的 RDD 进行转换,从而导致发生洗牌,则可能有一个中间步骤导致工作人员之间交换数据。查看集群主服务器的应用程序 UI,了解有关 spark 如何执行应用程序的更多信息。

【讨论】:

【参考方案2】:

首先,在这两个操作中,RDD 中存在的所有数据都会从不同的 executor/worker 传输到 Master/Driver。 collect 和 collectAsMap 都只会整理来自各种 executors/workers 的数据。所以这就是为什么总是建议不要使用收集,除非你没有任何其他选择。

我必须说,这是从性能角度必须考虑的最后一个集合。

    collect :将结果作为数组返回。 collectAsMap 会将配对 RDD 的结果作为 Map 集合返回。而且由于它返回 Map 集合,您只会得到具有唯一键的对,而具有重复键的对将被删除。

问候,

尼拉杰

【讨论】:

【参考方案3】:

支持以上答案:

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

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

这些方法将所有数据带到驱动程序。程序员在生产中使用它们时需要采取预防措施。

【讨论】:

以上是关于Spark CollectAsMap的主要内容,如果未能解决你的问题,请参考以下文章

spark提交参数解析

科普Spark,Spark是啥,如何使用Spark

Spark系列

Spark-01 spark简介

Spark 内核 Spark 内核解析-下

Spark官方文档: Spark Configuration(Spark配置)