本文来自11月举办的Data+AISummit(原Spark+AISummit),主题为《ImprovingSparkSQLPerformanceby30%:HowWeOptimizeParquetFilterPushdownandParquetReader》的分享,作者为字节跳动的孙科和郭俊。

Parquet是一种非常流行的列式存储格式。Spark的算子下推(pushdownfilters)可以利用Parquet文件的统计数据(比如最大最小值统计)来过滤无用数据。另一方面,Spark用户可以启用SparkParquet的向量化读取器(vectorizedreader)来批量读取parquet文件。这些特性大大提高了Spark的性能,节省了CPU和IO。Parquet是字节跳动数据仓库的默认数据格式。在实践中,字节团队的同学发现parquet的下推过滤器的工作效果很差,其读取了大量没用的统计数据,这些统计数据对过滤Parquet的rowgroups无效(当ETL作业写入Parquet文件时列数据是无序的)。

在过去一年时间里,自己在Spark中添加了一系列的优化措施来提升Parquet的下推性能。我们开发了一个名为LocalSort的特性,在写Parquet文件时通过对一些列添加一个排序步骤,从而可以利用这些统计数据明显区分ParquetRowgroups,并提高压缩比(根据历史查询自动进行,不需要修改ETL作业)。此外,我们开发了一个名为Prewhere的特性。Prewhereparquetreader从下推过滤器中选择低开销的列,以批处理方式来读取这些列的数据,并使用下推过滤器过滤数据,同时跳过其他不需要的列。这些努力的直接结果是,我们实现了平均30%的查询改进,40%的存储改进,而开销只有5%。

这篇文章将深入介绍LocalSort和Prewhere,同时介绍LocalSort/Prewhere都有哪些用户场景,最后也会介绍一些基于历史查询自动建议对列进行排序的相关工作。

下面是本文的视频,相关PPT可以



转载请注明地址:http://www.huluchaa.com/hlcpf/7147.html