全新的内置 Parquet Writer
为了提高文件写入效率,克服旧 Parquet writer 的弊端,Presto 社区引入了全新的原生 Parquet writer,它直接将 Presto 的内存数据结构写入 Parquet 的列式文件格式,包括数据值、重复值和定义值。 原生 Parquet writer 显着降低了 Presto 的 CPU 和内存开销。
如上图所示,原生 Parquet writer 根据列名和类型构造 Parquet 模式。基本类型(Primitive types)和复杂类型(Struct、Array、Map)转换为相应的 Parquet 类型。使用 schema 信息来创建 Column writers。 对于每个 Presto page,内置的 writer 迭代每个 block,将 Presto block 转换为 Parquet 值。 相应的 column writer 将字节流写入 Parquet 文件。
Presto 有一个 Hive 文件格式基准测试来测试 reader 和 writer 的性能。 该测试创建一个包含数百万行的 pages 列表,使用新的 native writer 或旧的 hive record writer 将它们写入到临时文件,然后比较性能。 下图显示了三种压缩方案的结果:gzip、snappy 和不压缩。 X 轴是各种类型的数据; Y 轴是写入吞吐量。 显然,我们可以看到全新的原生 Parquet writer 优于旧的 writer。 它可以持续实现 > 20% 的吞吐量改进。 原生 Parquet writer 在使用 GZIP 压缩的 BIGINT_SEQUENTIAL 和 BIGINT_RANDOM 方面表现最佳,吞吐量提高高达 650%。 写入 TPCH LINEITEM 的所有列时,吞吐量增益约为 50%。
我们可以在生产环境中使用 Native Parquet Writer,可以使用以下配置打开这个功能:
# in /catalog/hive.properties hive.parquet.optimized-writer.enabled=true
本文翻译自:Native Parquet Writer for Presto
本博客文章除特别声明,全部都是原创!