【发布时间】:2020-12-26 10:52:11
【问题描述】:
当我们在spark中使用show或take或write动作时,所有数据都会发送给驱动程序吗?如果不是,那为什么当我们使用collect 时,所有数据都到驱动程序?
【问题讨论】:
标签: apache-spark hadoop pyspark apache-spark-sql rdd
当我们在spark中使用show或take或write动作时,所有数据都会发送给驱动程序吗?如果不是,那为什么当我们使用collect 时,所有数据都到驱动程序?
【问题讨论】:
标签: apache-spark hadoop pyspark apache-spark-sql rdd
show 和 take 获取您请求的数据量(例如 20 行)到驱动程序,而 collect 获取 整个 数据帧中的数据,所有分区,到驱动程序。 write 会将整个dataframe输出到一个文件位置,但是一般都是以分区的方式完成的,也就是说每个executor可以直接将其partition中包含的数据写入文件系统。
【讨论】:
write fetch 不会将数据发送给驱动程序 - 不需要它。只有在只有一个分区或者您之前执行过coalesce(1) 时才会发生这种情况。当你写例如对于 HDFS,每个 executor 可以直接将其本地分区写入 HDFS 文件系统。我的意思是,这与从 HDFS 读取相同 - 文件拆分和分区将提前计算,然后分配给执行程序,每个执行程序将直接从 HDFS 加载
repartition(1) 或coalesce(1) 然后执行write 将使驱动程序收集所有数据并写入HDFS。但是如果我们先做repartition(2) 或coalesce(2) 然后再做write,那么驱动程序会出现吗?或者数据将在 executors 之间洗牌,将 10 个分区减少到 2 个分区??