首页 > 解决方案 > spark sql第二次运行同一个查询速度更快,如何让查询时间稳定?

问题描述

我正在使用 pyspark 从存储在 hdfs 上的镶木地板文件集合中进行查询。但是,第二次运行时,查询响应时间似乎更快。下面是从 spark UI 捕获的屏幕截图,请注意在查询 1(即第二次)中,总持续时间减半,parquet 扫描时间也几乎减半。

有一个类似的问题(为什么 spark sql 查询的执行时间在第一次和第二次执行时不同?),他们在交换短语中提到了 shuffle 文件重用。但是,在我的场景中,交换只需要数百毫秒,我认为这不是原因。

另一篇类似的帖子(为什么 Spark 查询在第二次执行时运行得更快?)提到了 IO 初始化的保存。我用pyarrow做了一个简单的实验(如下图),我们可以为每个文件节省大约0.5s。但是,在我们的场景中,有68个文件,不应该保存更多吗?这是否意味着我们只需要为所有 68 个文件初始化一次 IO?但在这种情况下,为什么我们可以节省超过 0.5 秒(即 parquet 扫描时间从 4.4 下降到 2.1)?

fs = pa.hdfs.connect()
fw1 = fs.open(save_path, 'rb') # about 0.5s
fw2 = fs.open(save_path, 'rb') # about 0.01s

我检查了以下 spark 和 hdfs 的缓存机制:

  1. 数据帧缓存(取消保留 (py)spark 中的所有数据帧),这没有任何区别
  2. parquet 元数据缓存(https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#metadata-refreshing),但我之前什至没有创建表,我怎么能刷新表元( spark.catalog.listTables 上唯一的数据库返回 [])
  3. hdfs 集中式缓存管理(https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html),但是 hdfs -cacheadmin -listPools 返回注意

所以,以上都不适合我。最重要的是,我需要一个稳定的查询响应时间,我怎么能禁用优化呢?谢谢。

这是我第一次运行查询 这是我第二次运行查询

标签: sqlapache-sparkpysparkapache-spark-sql

解决方案


推荐阅读