Spark CollectAsMap

Spark CollectAsMap

我想知道 collectAsMap 在 Spark 中是如何工作的。更具体地说,我想知道所有分区的数据将在哪里聚合?聚合要么发生在 master 中,要么发生在 worker 中。在第一种情况下,每个 worker 将其数据发送到 master 上,当 master 从每个 worker 收集数据时,master 将汇总结果。在第二种情况下,workers 负责聚合结果(在他们之间交换数据之后),然后将结果发送给 master。

找到一种方法让 master 能够分别从每个分区收集数据,而不需要 workers 交换数据,这对我来说很重要。

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

collectAsMap function

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

collect function

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

请注意,如果您在使用 collectAsMap 之前对 RDD 进行转换,这会导致随机播放发生,则可能会有一个中间步骤导致工作人员之间交换数据。查看集群主控的应用程序 UI 以查看有关 spark 如何执行您的应用程序的更多信息。

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

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

  1. collect : 将 return 结果作为数组。
  2. collectAsMap 将 return 配对 RDD 的结果作为 Map 集合。由于它是 returning Map 集合,您只会得到具有唯一键的对,具有重复键的对将被删除。

此致,

尼拉吉

支持以上答案:

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

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

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