我使用pyspark从hdfs上存储的Parquet文件集合中进行查询。但是,第二次运行时,查询响应时间似乎更快。下面是从spark ui截取的屏幕截图,请注意查询1中的(即第二次),总持续时间减半,Parquet地板扫描时间也减半。
还有一个类似的问题(为什么sparksql查询的执行时间在第一次执行和第二次执行时不同?),他们在exchange短语中提到了shuffle文件重用。然而,在我的场景中,交换只需要几百毫秒,我认为这不是原因。
另一个类似的帖子(为什么spark查询在第二次执行时运行得更快?)mentioend保存io初始化。我使用pyarrow做了一个简单的实验(如下所示),我们可以为每个文件节省大约0.5秒。然而,在我们的场景中,有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的以下缓存机制:
Dataframe缓存(取消(py)spark中所有Dataframe的持久化),这没有任何区别
Parquet元数据缓存(https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#metadata-刷新),但我以前甚至不创建表,如何刷新表meta(spark.catalog.listtables on the only database return[])
集中缓存管理(https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/centralizedcachemanagement.html)但是,hdfs-cacheadmin-listpools返回noting
所以,以上这些对我来说都不管用。。最重要的是,我需要一个稳定的查询响应时间,我怎样才能禁用优化呢?谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!