为啥 spark 中的“收集”动作会触发数据收集到驱动程序?

Posted

技术标签:

【中文标题】为啥 spark 中的“收集”动作会触发数据收集到驱动程序?【英文标题】:Why "collect" action in spark triggers data collection to driver?为什么 spark 中的“收集”动作会触发数据收集到驱动程序? 【发布时间】:2020-12-26 10:52:11 【问题描述】:

当我们在spark中使用showtakewrite动作时,所有数据都会发送给驱动程序吗?如果不是,那为什么当我们使用collect 时,所有数据都到驱动程序?

【问题讨论】:

【参考方案1】:

showtake 获取您请求的数据量(例如 20 行)到驱动程序,而 collect 获取 整个 数据帧中的数据,所有分区,到驱动程序。 write 会将整个dataframe输出到一个文件位置,但是一般都是以分区的方式完成的,也就是说每个executor可以直接将其partition中包含的数据写入文件系统。

【讨论】:

我认为write fetch 不会将数据发送给驱动程序 - 不需要它。只有在只有一个分区或者您之前执行过coalesce(1) 时才会发生这种情况。当你写例如对于 HDFS,每个 executor 可以直接将其本地分区写入 HDFS 文件系统。我的意思是,这与从 HDFS 读取相同 - 文件拆分和分区将提前计算,然后分配给执行程序,每个执行程序将直接从 HDFS 加载 假设我们有一个有 10 个分区的 RDD - 执行repartition(1)coalesce(1) 然后执行write 将使驱动程序收集所有数据并写入HDFS。但是如果我们先做repartition(2)coalesce(2) 然后再做write,那么驱动程序会出现吗?或者数据将在 executors 之间洗牌,将 10 个分区减少到 2 个分区??

以上是关于为啥 spark 中的“收集”动作会触发数据收集到驱动程序?的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维工具之Zabbix触发器_action动作及模板应用

将 spark DataFrame 中的行收集到 JSON 对象中,然后将对象放入另一个 DF

Spark Java - 将多列收集到数组列中

PyCharm:为啥它会收集我的个人数据 [关闭]

spark面试问题收集

动作捕捉用于无人机控制算法验证与数据集收集