引言
当前,数据量呈快速增长态势,给诸如 Presto 等查询引擎带来了挑战。
Presto 作为一种流行的交互式查询引擎,具有可扩展、高性能并可与 Hadoop 进行平滑集成的特性。随着数据量的增长,Presto 需要读取更大的数据块并将其加载到内存中,继而导致IO、内存占用增大以及 GC 时间变长等。
Apache Parquet 是一种可用于高效存储和检索数据的开源列式文件格式,提供高效的数据压缩和编码方案,性能更优,能批量处理复杂的数据。
我们先前已经采取了一些措施来加快 Presto 对 Parquet 数据的读取速度,但需要读取的数据量依旧很大。从 Java 版本的 Parquet(parquet-mr 1.11.0) 开始,Parquet 添加了一个名为 Page Index 的特性,通过在列块(column chunk)中过滤不必要的 Parquet 页(page)来加快查询速度。
本文就该特性、移植到 Presto 的状态以及基准测试结果进行了介绍。
统计信息
Parquet 文件元数据包含有关文件中数据的最小/最大值的统计信息。对于一个给定 filter 的查询而言,统计信息的最小/最大值可以用作 filter 要查找的值的范围。如果要查找的值不在范围内,就可以跳过读取该数据块。这样一来提高了 IO、内存和 CPU等资源的利用率,从而加快了查询速度。
下述示例展示了如何将 filter 应用于包含统计信息的表,‘x > 100’的 filter 会查找(100, ∞) 范围内的值。表中的统计信息显示只有第二列(最小值为 1 和最大值为 209) 的数值范围 [1, 209],与 filter 的过滤范围重叠。因此,我们可以跳过读取剩余 3 列,从而将数据读取的时间减少3/4 。