一、什么是压缩
压缩就是通过某种技术(算法)把原始文件大小变小,相应的解压就是把压缩后的文件变成原始文件。此处注意,压缩过程中,有些个别压缩算法是会丢失一部分数据的,看你们项目上对丢失数据的容忍程度了。
Hadoop的压缩与我们日常使用的解压缩不同,Hadoop在切片过程中,只支持特定的几种压缩类型,否则无法切片(Split)。
二、使用场景
-
输入时
-
中间过程中
-
输出时
三、Hadoop文件压缩优势与缺点
- 优势
- 减少了文件所需的存储空间
- 加快了文件在网络上或磁盘间的传输速度。
- 缺点
- 压缩和解压肯定要耗费CPU算力的,开启解压缩肯定会导致集群负载升高,从而导致你的计算缓慢,Job阻塞,文件读取变慢一系列原因。
- 总结
- 不同的场景选择不同的压缩方式。选择高压缩比,那么CPU的性能要高,同时解压缩时间耗费也多;选择压缩比低的,对于磁盘io、网络io的压力、空间占据要多。
- 需要考虑到你使用的压缩格式,是否支持切片(Split)。如果不支持切片的压缩类型,整个Job的作业只能被分配到一个
Task中执行。并行度问题使你需要考虑清楚你的压缩选型。 - 没有什么压缩类型是一劳永逸的,选择最适合自己业务的压缩类型。举个例子:你渴了应该喝水,饿了应该吃饭。你如果饿了,选择去喝水。。。你得喝多少才能喝饱,就算喝饱了,又能有多
持久!0.0
四、压缩格式
- 测试环境
- TextData大小:1.4G
- Core:8
- Core主频:3.5GHz
- Memory:16G
| 压缩格式 | 文件扩展名 | 压缩比 | 压缩速率 | 解压速率 | 是否支持切割 |
|---|---|---|---|---|---|
| gzip | .gz | 68% | 86s | 22s | No |
| bzip | .bz2 | 72% | 142s | 62s | 支持 |
| LZO | .lzo | 51% | 8s | 11s | 需要建立索引 |
| Snappy | .snappy | 50% | 6s | 20s | No |
| LZ4 | .LZ4 | 50% | 6s | 2s | No |
- 压缩比
-
压缩时间
-
排序
- **压缩比:**Snappy < LZ4 < LZO < GZIP < BZIP2
- **压缩时间比:**BZIP2 < GZIP < Snappy < LZO < LZ4
都说到这份上了,就不一一列举每个压缩格式的优劣。如果在不知道自己公司现有的业务适合什么压缩。。。。。
五、压缩参数设置
| 配置文件 | Name | Defalt Value | 说明 | |
|---|---|---|---|---|
| core-site.xml | io.compression.codecs | 官网value默认是空的 | 在命令行输入hadoop checknative查看 | |
| mapred-site.xml | mapper输出 | mapreduce.map.output.compress | false | 设置为True启用 |
| mapred-site.xml | mapper输出 | mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | 企业多使用LZO或Snappy编解码器在此阶段压缩数据 |
| mapred-site.xml | reducer输出 | mapreduce.output.fileoutputformat.compress | false | 设为true启用压缩 |
| mapred-site.xml | reducer输出 | mapreduce.output.fileoutputformat.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | 作业最终压缩 |
| mapred-site.xml | mapreduce.output.fileoutputformat.compress.type | RECORD | SequenceFile输出使用的压缩类型 |