Parquet性能测试调优及其优化建议
Parquet性能测试调优及其优化建议
Parquet是一种列式存储格式,广泛应用于大数据处理和存储领域。本文通过详细的性能测试和数据分析,展示了Parquet在读取效率、列式计算和压缩效率方面的优势,并提供了实际应用中的优化建议。
一、为什么选择Parquet
- 外部因素
- 我们已经在使用Spark集群,而Spark原生支持Parquet格式,并推荐其作为默认存储格式。
- Hive也支持Parquet格式存储,使用HiveSQL查询完全兼容。
- 内在优势
- 高效压缩:由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法。测试显示,Parquet的压缩比可达27倍(默认使用gzip压缩,压缩率最高,解压速度最快)。
- 列式读取:查询时只需读取涉及的列,无需扫描全部数据,显著降低I/O消耗。同时,可以保存列的统计信息(如min、max、sum等)。
- 分区过滤与列修剪:Parquet结合Spark可以实现分区过滤和列修剪,减少不必要的数据读取,提高查询效率。
二、Parquet存储格式解析
Parquet文件在磁盘上的分布情况如下图所示:
- Row group:数据被水平切分成Row group,每个Row group包含其对应区间内的所有列的column chunk。
- Column chunk:负责存储某一列的数据,包括Repetition level、Definition level和Values。
- Page:是压缩和编码的单元,对数据模型透明。
- Footer:存储文件的元数据信息和统计信息。
推荐设置较大的Row group以提高并行度,一般建议配置为1G大小,同时HDFS块大小也为1G,一个HDFS文件只包含一个块。
三、Parquet性能测试
1. 普通文件与Parquet文件读取列性能对比
测试环境:58.56机器、Spark 1.6、STS、Hive等
测试目的:验证Spark在读取普通文件和Parquet文件时,读取相同列的速率差异。
测试结果(约27005万数据):
查询列数 | 普通Hive表耗时 | Parquet表耗时 |
---|---|---|
1列 | 2分53秒 | 2分42秒 |
5列 | 3分53秒 | 1分27秒 |
20列 | 5分58秒 | 3分56秒 |
35列 | 9分16秒 | 9分36秒 |
50列 | 13分19秒 | 8分11秒 |
结论:随着列数增加,读取时间增加。在列数较多时,使用Parquet存储可以显著提高读取效率。
2. Parquet列式存储在列式计算中的效率
测试环境:58.56机器、Spark 1.6、STS、Hive等
测试目的:验证Spark在读取普通文件和Parquet文件时,针对某些列式运算的性能差异。
测试结果:
第一组(2个求和,3个求平均):
普通Hive表平均耗时:2分33秒
Parquet表平均耗时:1分27秒
第二组(2个求和,3个求平均,2个求最大值,2个求最小值):
普通Hive表平均耗时:2分37秒
Parquet表平均耗时:1分42秒
第三组(4个求和,4个求平均,4个求最大值,4个求最小值):
普通Hive表平均耗时:2分52秒
Parquet表平均耗时:2分02秒
结论:Parquet在列式计算中比普通行式存储有明显优势,运算效率提升30%-40%。
3. 压缩效率对比
测试环境:58.56机器、Spark 1.6、STS、Hive等
测试目的:验证普通文件和Parquet文件的压缩效率差异。
测试结果:
- 普通文件总大小:12.6G
- Parquet文件总大小:3.6G
- 压缩空间减少:近70%
四、Parquet在实际项目中的应用建议
- 当读取的列数并非全部列数时,建议使用Parquet格式存储(建表时使用
stored by parquet
)。 - 在进行列式计算或向量计算时,建议使用Parquet格式存储,以提高运算效率。
- 如果需要备份存储,可以使用Parquet文件进行压缩,以节约空间并提高压缩效率和速率。
注:文中提到的Spark版本(1.6)已较为陈旧,当前Spark的最新版本在功能和性能上可能有所改进。在实际应用中,建议参考最新版本的官方文档和最佳实践。