【问题标题】:Spark. Data caching?火花。数据缓存?
【发布时间】: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 并重新启动它时,我都会在第一次执行之前看到这两个额外的作业。 当然,类似的观察结果也适用于其他查询。

问题

  1. 是否可以证明或否定关于缓存的假设?
  2. 如果是用于缓存 - 如何禁用缓存以及如何清理它?

更新。工作详情。

【问题讨论】:

  • 您可以尝试在查询前添加以下代码:spark.catalog.refreshTable("partitioned_table") 吗?它会改变运行时间吗?
  • lev,没有任何改变。
  • 您可以尝试的另一件事是运行spark.sql(q).explain。它将打印物理计划,您可以看到运行之间的变化
  • 嗯,显然计划是一样的。我关心的是作业 1,尤其是在首次运行之前执行的作业 0。大部分时间都花在了似乎正在扫描所有分区的作业 0 上。

标签: performance hadoop apache-spark caching apache-spark-sql


【解决方案1】:

特定 Spark 版本 2.0.2 出现此问题。 在构建计划和执行查询之前,Spark 一直在扫描所有分区。

问题已在 Spark 2.1.0 中记录并修复

https://issues.apache.org/jira/browse/SPARK-16980

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多