【发布时间】:2018-07-11 00:01:04
【问题描述】:
我正在 spark-shell 中测试以下脚本 - 分区表的单分区扫描。
val s = System.nanoTime
var q =
s"""
select * from partitioned_table where part_column = 'part_column_value'
"""
spark.sql(q).show
println("Elapsed: " + (System.nanoTime-s) / 1e9 + " seconds")
第一次执行大约需要 30 秒,而所有后续执行大约需要 2 秒。
如果我们查看运行时统计信息 - 在第一次执行之前还有两个额外的作业
看起来有 1212 个阶段的作业扫描表中的所有分区(分区总数 1199,此表的 HDFS 文件总数 - 1384)。
我没有找到一种方法来发现作业 0 正在运行的 scala/java 或 SQL 代码到底是什么,但我怀疑它是为了缓存。
每次我退出 spark-shell 并重新启动它时,我都会在第一次执行之前看到这两个额外的作业。 当然,类似的观察结果也适用于其他查询。
问题
- 是否可以证明或否定关于缓存的假设?
- 如果是用于缓存 - 如何禁用缓存以及如何清理它?
更新。工作详情。
【问题讨论】:
-
您可以尝试在查询前添加以下代码:
spark.catalog.refreshTable("partitioned_table")吗?它会改变运行时间吗? -
lev,没有任何改变。
-
您可以尝试的另一件事是运行
spark.sql(q).explain。它将打印物理计划,您可以看到运行之间的变化 -
嗯,显然计划是一样的。我关心的是作业 1,尤其是在首次运行之前执行的作业 0。大部分时间都花在了似乎正在扫描所有分区的作业 0 上。
标签: performance hadoop apache-spark caching apache-spark-sql