sql - 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 的缓存机制:
- 数据帧缓存(取消保留 (py)spark 中的所有数据帧),这没有任何区别
- parquet 元数据缓存(https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#metadata-refreshing),但我之前什至没有创建表,我怎么能刷新表元( spark.catalog.listTables 上唯一的数据库返回 [])
- hdfs 集中式缓存管理(https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html),但是 hdfs -cacheadmin -listPools 返回注意
所以,以上都不适合我。最重要的是,我需要一个稳定的查询响应时间,我怎么能禁用优化呢?谢谢。
解决方案
推荐阅读
- python - 如何验证以 2 个数字开头的用户输入?
- python - 为什么每当我使用函数时,我总是在 atom 中得到一个空白结果?
- jquery - 如何遍历每个项目并为每个实例返回相应的值(jquery和scrollmagic)
- javafx - 如何检测舞台外拖板的元素?
- sqlite - Pycharm Database for SQlite 将日期和日期时间列转换为长整数
- vba - 如何使用 VBA 关闭 Access 数据库并在同一实例、同一用户上打开一个新数据库?
- javascript - 如何合并 2 个对象,每个对象都包含一个对象数组?
- php - 我们应该在存储库模式中保存/更新模型吗?
- linux-kernel - 强制linux内核运行代码而不抢占
- node.js - Node.js 类型错误第一个参数必须是字符串或缓冲区