【问题标题】:Parquet compression degradation when upgrading spark升级火花时镶木地板压缩退化
【发布时间】:2021-07-28 12:01:52
【问题描述】:

我有一个 spark 作业,它通过快速压缩将数据写入 parquet 文件。 parquet 中的一列是重复的 INT64。

当从带有 parquet 1.8.2 的 spark 2.2 升级到带有 parquet 1.10.1 的 spark 3.1.1 时,我目睹了压缩比的严重下降。

this file 为例(使用 spark 2.2 保存)我有以下元数据:

creator:     parquet-mr version 1.8.2 (build c6522788629e590a53eb79874b95f6c3ff11f16c) 
extra:       org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"numbers","type":{"type":"array","elementType":"long","containsNull":true},"nullable":true,"metadata":{}}]} 

file schema: spark_schema 
--------------------------------------------------------------------------------
numbers:     OPTIONAL F:1 
.list:       REPEATED F:1 
..element:   OPTIONAL INT64 R:1 D:3

row group 1: RC:186226 TS:163626010 OFFSET:4 
--------------------------------------------------------------------------------
numbers:     
.list:       
..element:    INT64 SNAPPY DO:0 FPO:4 SZ:79747617/163626010/2.05 VC:87158527 ENC:RLE,PLAIN_DICTIONARY ST:[min: 4, max: 1967324, num_nulls: 39883]

使用 spark 3.1 读取它并再次将其保存为 parquet,我得到以下元数据,parquet 部分大小从 76MB 增加到 124MB:

creator:     parquet-mr version 1.10.1 (build a89df8f9932b6ef6633d06069e50c9b7970bebd1) 
extra:       org.apache.spark.version = 3.1.1 
extra:       org.apache.spark.sql.parquet.row.metadata = {"type":"struct","fields":[{"name":"numbers","type":{"type":"array","elementType":"long","containsNull":true},"nullable":true,"metadata":{}}]} 

file schema: spark_schema 
--------------------------------------------------------------------------------
numbers:     OPTIONAL F:1 
.list:       REPEATED F:1 
..element:   OPTIONAL INT64 R:1 D:3

row group 1: RC:186226 TS:163655597 OFFSET:4 
--------------------------------------------------------------------------------
numbers:     
.list:       
..element:    INT64 SNAPPY DO:0 FPO:4 SZ:129657160/163655597/1.26 VC:87158527 ENC:RLE,PLAIN_DICTIONARY ST:[min: 4, max: 1967324, num_nulls: 39883]

注意压缩比从2.05 降低到1.26

尝试查找在 spark 或 parquet 版本之间发生变化的任何配置。我唯一能找到的是parquet.writer.max-padding0 更改为8MB,但即使将此配置更改回0,我也会得到相同的结果。

以下是我在两种设置中的 ParquetOutputFormat 配置:

Parquet block size to 134217728
Parquet page size to 1048576
Parquet dictionary page size to 1048576
Dictionary is on
Validation is off
Writer version is: PARQUET_1_0
Maximum row group padding size is 0 bytes
Page size checking is: estimated
Min row count for page size check is: 100
Max row count for page size check is: 10000

我会很感激这里的任何指导。

谢谢!

更新

用 snappy 1.1.2.6(由 spark 2.2 使用)检查 spark 3,压缩比看起来不错。 将进一步研究这个问题,并更新我的发现。

【问题讨论】:

    标签: apache-spark apache-spark-sql parquet snappy


    【解决方案1】:

    如上所述,snappy-java 1.1.2.6 解决了我的问题。 任何高于此的版本都会导致压缩降级。还尝试了purejava 标志,但这会导致异常读取镶木地板。 将为 snappy-java 开票

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 2018-12-20
      • 2016-01-18
      • 2020-02-25
      • 2019-02-19
      • 2021-06-13
      • 2017-03-09
      • 2021-09-14
      • 2018-06-06
      相关资源
      最近更新 更多