我一直在探索Spark SQL中的全阶段代码生成优化(又名全阶段代码生成),并且想知道多少" stage"在" while-stage"来自Spark Core的一个阶段(Spark工作)的含义?
Spark SQL和Spark Core中的整阶代码阶段之间是否存在任何技术关系?或者他们更广泛地使用它们来指代"阶段"在计算?
答案 0 :(得分:7)
“stage”的术语(和概念)在RDD执行,SQL / DataFrame执行和" Wholestage Codegen中是相同的。"
阶段是指从读取(从外部源或先前的shuffle)到后续写入(到下一个shuffle或最终输出位置,如文件系统,数据库等)的所有窄(map)操作。
使用Wholestage Codegen,在可能的情况下,每个物理运营商都会生成一些代码并将它们融合在一起" (基于像乐高积木这样的常见模式)制作一个可编译的大型Java函数 - 称之为" f"
然后执行(大致)执行RDD[InternalRow]
所需的字段/列并执行rdd.mapPartitions(f)
另一种看待它的方法是在SQL UI选项卡中:当“完整”的Wholestage Codegen实现时,蓝色外部codegen框覆盖除Exchange框之外的所有内容(物理随机播放)
答案 1 :(得分:5)
这些概念非常相似,但并不总是相同。
在Spark Core Stage中,对应于一个随机边界内的一组运算符。
下面的表达式中的explain()函数已经扩展用于整个阶段代码生成。在explain输出中,当运算符周围有星(*)时,启用整阶代码生成。在下面的例子中,Range,Filter和两个Aggreg都在运行全阶段代码。但是,Exchange不会实现整阶代码生成,因为它通过网络发送数据。
spark.range(1000).filter("id > 100").selectExpr("sum(id)").explain()
== Physical Plan ==
*Aggregate(functions=[sum(id#201L)])
+- Exchange SinglePartition, None
+- *Aggregate(functions=[sum(id#201L)])
+- *Filter (id#201L > 100)
+- *Range 0, 1, 3, 1000, [id#201L]
在Full-Stage-Codegen的情况下,CollapseCodegenStages物理准备规则用于查找支持codegen的计划并将它们作为WholeStageCodegen折叠在一起。
请仔细阅读以下链接以获得更好的主意。
https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-whole-stage-codegen.html
https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-CollapseCodegenStages.html