Spark中df.show()函数执行算法及数据拉取的Executor选择规则问询
Spark
df.show() 拉取记录的节点规则 df.show()本质是Spark的Action算子,默认返回前20条数据,底层调用take(n)算子实现,拉取记录的节点规则完全遵循take算子的执行逻辑:
- 优先按分区序号从小到大拉取:Spark的DataFrame分区是天然有序的,
take(n)会先尝试从序号最小的第一个分区拉取所有数据,如果该分区的记录数已经≥需要展示的n条,就直接结束拉取,仅会请求第一个分区所在的Executor节点;如果第一个分区记录不足n,再依次请求第二个、第三个分区所在的Executor,直到拿够n条数据为止,后续分区的Executor不会被访问。 - 遵循本地性调度规则:如果目标分区的副本和Driver在同一节点,会优先读取本地副本,不走网络传输;如果目标分区所在的Executor正常存活,就直接从该Executor拉取分区数据,仅当Executor宕机时,才会触发容错机制重新计算对应分区后再拉取。
- 全局排序后调用show的特殊规则:如果你的DataFrame执行过
orderBy全局排序操作后再调用show,全局排序会将数据重新shuffle为有序的新分区,依然按照上述规则从新的最小编号分区所在的Executor拉取数据;如果是orderBy().limit(n).show()的写法,Spark会做优化:先在所有存有待排序数据的Executor节点上计算本地TopN,再把所有节点的本地TopN拉取到Driver端合并为全局TopN,此时会从所有参与排序计算的Executor节点拉取数据。
举个实际例子:你调用
df.show(50),如果DataFrame第一个分区有70条数据,全程只会请求第一个分区所在的Executor,其他Executor不会收到任何拉取请求;如果第一个分区只有30条数据,会额外请求第二个分区所在的Executor,拿20条数据就结束。
内容的提问来源于stack exchange,提问作者Sumitav Jena
相关产品推荐
相关产品推荐

