如何在AWS Glue作业中设置zstd压缩级别?
背景
zstd压缩编解码器有22个压缩级别。我了解到调整压缩级别可在压缩时间和文件大小间取得平衡后,用df.to_parquet验证自有数据,得到了符合预期的实验结果。因此我希望在写入Delta Lake的AWS Glue Spark作业中将zstd压缩级别设置为19。
实验1
我的AWS Glue作业使用Glue 4.0 - Spark 3.3, Scala 2, Python 3版本。
作业代码如下:
import sys from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job args = getResolvedOptions(sys.argv, ["JOB_NAME"]) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args["JOB_NAME"], args) S3bucket_node1 = glueContext.create_dynamic_frame.from_options( format_options={}, connection_type="s3", format="parquet", connection_options={ "paths": [ "s3://my-bucket/data/raw-parquet/motor/" ], "recurse": True, }, transformation_ctx="S3bucket_node1", ) additional_options = { "path": "s3://my-bucket/data/delta-tables/motor/", "mergeSchema": "true", } sink_to_delta_lake_node3_df = S3bucket_node1.toDF() sink_to_delta_lake_node3_df.write.format("delta").options(**additional_options).mode( "overwrite" ).save() job.commit()
我尝试通过配置参数设置zstd压缩级别,指定了以下--conf配置:
--conf spark.sql.parquet.compression.codec=zstd --conf parquet.compression.codec.zstd.level=19
在Glue作业中,我通过作业详情 -> 高级属性 -> 作业参数添加这些配置:
- 键:
--conf - 值:
spark.sql.parquet.compression.codec=zstd --conf parquet.compression.codec.zstd.level=19
但对比压缩级别3和19的运行结果,Delta Lake生成的Parquet文件大小完全相同,均为97 MB(97,002,126字节)。
为验证数据本身在不同zstd压缩级别下会产生大小差异,我用本地Python代码测试:
df.to_parquet( local_parquet_path, engine="pyarrow", compression="zstd", compression_level=19 )
结果显示级别19的文件大小是级别3的92%,说明数据本身确实能通过调整zstd压缩级别改变文件大小,但Spark中的上述配置并未生效。
如何在AWS Glue作业中正确设置zstd压缩级别?
实验2~4(2023年9月29日)
我尝试了以下多组配置组合:
组合1:
--conf spark.sql.parquet.compression.codec=zstd --conf parquet.compression.codec.zstd.level=19
组合2:
--conf spark.sql.parquet.compression.codec=zstd --conf spark.io.compression.codec=zstd --conf spark.io.compression.zstd.level=19
组合3:
--conf spark.sql.parquet.compression.codec=zstd --conf parquet.compression.codec.zstd.level=19 --conf spark.io.compression.codec=zstd --conf spark.io.compression.zstd.level=19
所有组合的结果一致:Delta Lake生成的zstd格式Parquet文件大小,和未设置压缩级别或设置为3时完全相同。
实验5(2023年9月29日)
仅使用以下配置时:
--conf spark.io.compression.codec=zstd --conf spark.io.compression.zstd.level=19
最终生成的是Snappy格式文件(例如part-00000-1c8c7408-b14f-4ba1-9030-ecc437a2f8d3-c000.snappy.parquet),说明spark.io.compression.codec=zstd配置未生效。
内容的提问来源于stack exchange,提问作者Hongbo Miao

