为啥 spark 中的“收集”动作会触发数据收集到驱动程序?
Posted
技术标签:
【中文标题】为啥 spark 中的“收集”动作会触发数据收集到驱动程序?【英文标题】:Why "collect" action in spark triggers data collection to driver?为什么 spark 中的“收集”动作会触发数据收集到驱动程序? 【发布时间】:2020-12-26 10:52:11 【问题描述】:当我们在spark中使用show
或take
或write
动作时,所有数据都会发送给驱动程序吗?如果不是,那为什么当我们使用collect
时,所有数据都到驱动程序?
【问题讨论】:
【参考方案1】:show
和 take
获取您请求的数据量(例如 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动作及模板应用