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的主要内容,如果未能解决你的问题,请参考以下文章