scala - Scala - 在不执行的情况下获取具有阶段和任务的 DAG
问题描述
我正在寻找一种使用 RDD 获取 Scala Spark 应用程序的 DAG 的方法,包括阶段和任务。
我已经尝试过rdd.toDebugString
,但它只显示 RDD 血统,而不是我正在寻找的 DAG。
我知道有显示 DAG 的 Web UI,但我想从代码中提取 DAG,就像explain
函数对数据帧所做的那样。
解决方案
以下几点:
rdd.toDebugString
仅适用于执行前的 RDD。执行 DAG是您可以在运行时通过Spark Web UI观察 RDD 和 Dataframes 的东西。查看新版本:https ://spark.apache.org/docs/3.0.0-preview/web-ui.html
在执行之前,您可以运行一个
.explain
for Dataframes。- 从一个好的来源:
Spark SQL EXPLAIN 运算符提供有关 sql 语句的详细计划信息,而无需实际运行它。您可以使用 Spark SQL EXPLAIN 运算符显示 Spark 执行引擎在执行任何查询时将生成和使用的实际执行计划。您可以使用此执行计划来优化您的查询。
数据框的一个简单示例:
import org.apache.spark.sql.Row
val dfsFilename = "/FileStore/tables/sample_text.txt"
val readFileDF = spark.sparkContext.textFile(dfsFilename)
val wordsDF = readFileDF.flatMap(_.split(" ")).toDF
val wcounts3 = wordsDF.filter(r => (r(0) != "Humpty") || (r(0) != "Dumpty"))
.groupBy("Value") // Note the value
.count().explain()
您为 Dataframe/Dataset 适当地标记语句,但不在 show() 上。
== Physical Plan ==
*(2) HashAggregate(keys=[Value#4], functions=[finalmerge_count(merge count#14L) AS count(1)#8L])
+- Exchange hashpartitioning(Value#4, 200), [id=#61]
+- *(1) HashAggregate(keys=[Value#4], functions=[partial_count(1) AS count#14L])
+- *(1) Filter <function1>.apply
+- *(1) SerializeFromObject [staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, input[0, java.lang.String, true], true, false) AS value#4]
+- Scan[obj#3]
你可以在这里看到一些限制/微妙之处Spark 2.x - How to generate simple Explain/Execution Plan。
在 Spark 3.x 中,我不确定它是否可以像运行时评估一样工作。即Spark SQL 的自适应执行。这是链接:https ://medium.com/cloudzone/apache-spark-3-0-review-what-the-spark-is-all-about-998844e12b3c
您的具体问题:不可能,也可能不完全有效,因为几乎没有需要考虑的优化。
推荐阅读
- kotlin - Kotlin 1.5.0 和 1.6.0 中具有可为空参数的数据类引发 BackendException
- python-3.x - Python Pandas:匹配数据框中列的值并将另一列值复制到另一个数据框中
- gitlab - GitLab-CI:限制同一分支的并行管道
- php - 在循环中生成时将表单验证错误消息链接到特定表单实例 - PHP
- java - 如何在java中将方法标记为不鼓励?
- pull-request - AWS CodeCommit 拉取请求中的拆分视图显示意外结果
- r - Xgboost 标签类别如何响应从 xgb.importance 标识的每个变量?
- newrelic - New Relic - .NET IIS 中的自定义属性
- ios - 在 Swift 上使用 AudioKit 反转 InputNode 上的音频相位
- python - Matplotlib 导航工具栏打破 PyQT5 布局中的垂直对齐