1、 hadoop中的压缩格式
压缩格式 | 文件扩展名 | 是否可分割 | 压 缩 比 由 高 到 低
| 压 缩 时 间 由 长 到 慢 |
BZIP2 | .bz2 | 是 | ||
GZIP | .gz | 否 | ||
LZO | .lzo | 是(建立index) | ||
LZ4 | .LZ4 | 否 | ||
Snappy | .snappy | 否 |
2、选择什么样的压缩方式?
对于压缩的好处可以从两方面考虑:Storage+Compute
1. Storage:基于HDFS考虑,减少了存储文件所占空间,提升了数据传输速率。
2. Compute:基于YARN上的计算(MapReduce/Hive/Spark/Flink/...)速度的提升。
不同的场景选择不同的压缩方式
1.如果选择高压缩比,那么对于cpu的性能要求要高,同时压缩、解压时间耗费也多;
2.选择压缩比低的,对于磁盘io、网络io的时间要多,空间占据要多
3.对于支持分割的,可以实现并行处理
ps:分片的理解:举个例子,对于一个未压缩1G的文件,hdfs默认的block大小为128M,那么这个文件会被分为8个block作为mapreduce的输入,每一个单独使用一个map任务。如果文件特别大,需要使用压缩,例如使用gzip压缩方式,在hdfs上依然存储为8个block,但是gzip不支持分割(不支持随机读),当mapreduce处理时,会把这个8个块分给一个map去处理,这样就会有很多非本地处理的map任务,丢失数据的本地性,如果使用bzip2压缩格式则可以避免。
3、压缩在hadoop的应用场景
总结在三方面:输入、中间、输出:hdfs==>map==>shuffle==>reduce
1.从hdfs读取文件进行mapReduce作业,如果数据很大,可以使用压缩并且选择支持分片的压缩方式(bzip2、lzo),可以实现并行处理,提高效率,减少磁盘读取时间,同时选择合适的存储格式例如Sequence Files、RC、ORC等。
2.map输出作为reduce的输入,需要经过shuffle这一过程,需要先把数据读取到缓冲区,然后在写入到本地磁盘,所以选择压缩可以减少存储文件所占空间,提升了数据传输速率,建议使用压缩速度快的压缩方式,例如Snappy和LZO。
3.如果作为归档处理,可以采用高压缩比方式(gzip、Bzip2),如果作为下个作业的输入,考虑是否分片。