Spark读取压缩文件性能分析

本文对比分析了Spark处理不同压缩格式文件的效率,包括GZIP、BZIP2、LZO、LZ4、SNAPPY等,通过实验数据展示了各种格式在文件大小、运行时间和并发数上的表现,为大数据处理提供了优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

HDFS上分布式文件存储,成为大数据平台首选存储平台。而Spark往往以HDFS文件为输入,为保持兼容性,Spark支持多种格式文件读取,大数据场景下,性能瓶颈往往是IO,而不是CPU算力,所以对文件的压缩处理成为了很必要的手段。Spark为提供兼容性,同时支持多种压缩包直接读取,方便于用户使用,不用提前对压缩格式处理,但各种压缩格式各有优缺点,若不注意将导致Spark的能力无法发挥出来。故,对Spark计算压缩文件做一个分析。

支持的压缩格式

首先来看一下Spark读取HDFS文件常用的压缩格式:

存储格式优点缺点是否可切分建议用途备注
GZIP压缩率高CPU使用率高,压缩慢冷数据
BZIP2压缩率高,部分文件格式甚至比GZIP高CPU使用率高,压缩慢,HBase不支持冷数据
LZO压缩快压缩率低,原生不支持,需要额外安装热数据因为使用GPL协议,所以一般不自带,有条件可提前分割文件,适合于MR任务
LZ4压缩快,解压速度比LZO更快压缩率比LZO略低热数据
SNAPPY压缩快,普遍比LZO更快,原生支持压缩率低热数据HDFS使用最广泛的压缩格式,但不可拆分。但是在Container file format里面的Snappy块是可以拆分的,例如Avro和SequenceFile。Snappy一般也需要和一个Container file format一起使用[1]

[1] :Avro和SequenceFile为另外两种压缩格式,一般结合Snappy做分块压缩,但目前没有找到相关资料。

执行对比分析

  • 实验数据:同一个文件包,json格式文件数据
  • 处理逻辑:增加列,然后发送到kafka中。
  • DAG逻辑划分:两个job(read动作一个job,foreach动作一个job),每个job下面各一个stage,每个stage下面task若干
  • 程序执行参数:–master yarn --deploy-mode client --executor-cores 4 --executor-memory 4G --num-executors 4
  • Spark逻辑代码:
df = spark.read.json("\data\2019\08\23\*****.json")
udf_parse_os = udf(parse_os, StringType())
df = df.select(df.ip, df.port, df.data, df.host, udf_parse_os(df.data).alias("os"))
df.foreachPartition(send_message_helper)

非压缩文件

文件大小:33.7GB
运行时间:9min

read阶段:

在这里插入图片描述
可以看到所有节点都在读取,分布式读取,速度很快。

在这里插入图片描述
Stage里面共计分成了252个task,每个读取128MB数据。

foreach阶段

在这里插入图片描述
依然并行全力计算
在这里插入图片描述
每个执行节点上4个core都在并发运行。


GZIP

文件大小:10.6GB
运行时间:2.2h

read阶段

在这里插入图片描述
只有单节点读取
在这里插入图片描述
同时该节点上也只有一个核心在运行

foreach阶段

在这里插入图片描述
也是只有单节点、单core运行


BZIP2

文件大小:7.7GB
运行时间:12min

read阶段

在这里插入图片描述
与非压缩一致,并行进行

foreach阶段

在这里插入图片描述
同样并发执行


SNAPPY

文件大小:16.5GB
运行时间:2.1h
这里直接采用的整文件压缩,所以文件不可分割。

read阶段

在这里插入图片描述
单节点单核心读取,非并行。

foreach阶段

同上类似,单节点单核心运行

结果

压缩格式文件体积运行时间并发数
非压缩33.7GB9min16
GZIP10.6GB2.2h1
BZ27.7GB12min16
SNAPPY16.5GB2.1h1

gzip和snappy无法采用并行计算,也就是说在spark平台上,这两种格式只能采用串行单进程执行,于本文开头表格对应,无法分割(splittable)的压缩格式只能顺序一个进程读取,而读取后多文件又在一个executor上,其他executor无文件导致无法并行的foreach。
bz2和非压缩格式支持分割,也就是说可以并行读取以及计算。
不可分割的压缩格式文件不可并行读取,完全无法发挥spark的并行计算优势,并且若压缩包过大,对单节点的物理性能要求较高。

建议

snappy采用分块压缩方式使其可以并行读取计算。
gzip格式最好提前进行分割成小文件或者换格式,因多个文件可以并行读取。另一个办法是read文件后调用repartition操作强制将读取多数据重新均匀分配到不同的executor上,但这个操作会导致大量单节点性能占用,因此该格式建议不在spark上使用。
bz2表现相同于非压缩,但解压操作需要耗费时间。
非压缩性能表现最佳,但会占用过大HDFS存储。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值