【压缩方式对比】正确选择大数据处理过程中的压缩方式

HDFS admin 2年前 (2018-11-05) 44次浏览 0个评论 扫描二维码

1、当前比较常见的离线处理/批处理框架:

hadoop/hive/spark/flink

2、通用的离线处理流程

流程中Batch到DB是可行的,但是在生产中我们通常只需要把最终结果写入关系库中

3、不同的压缩方式带来不一样的数据处理并行度

如上图中的介绍:

1)优点:

1G的文件通过压缩后减少为500M
更少的磁盘IO、更少的磁盘存储空间、更少的网络传输;

2)缺点

解压过程需要更多的CPU消耗,如果生产服务器已经有了很高的CPU负载,压缩、解压则需要额外的cpu占用,此时就不适合使用压缩的方式。
而且并不是所有的压缩格式都支持分割,也就是说如果无法分割,那么这个文件在HDFS中将被存储为500M的块,而不会被拆分成128M的块,由此造成数据读取与分析时只能有一个task来进行数据处理,造成处理速度慢的问题

4、选择合适的压缩格式:

1)既要减少磁盘存储与网络消耗,又要能进行拆分以支持多task并行
2)Compression过程中:
如:使用一个标记替代相同字段的方式:
可能会存在数据丢失的问题,那么就存在两种不同的算法:
- lossless 无损压缩:计费日志,不容有失
- lossy 有损压缩,丢数据:牺牲精度换取空间,如图片、视频等常见的丢帧问题,并不会造成太大影响

5、常用压缩格式对比

测试环境:
- 8 core i7 CPU
- 8GB memory
- 64 bit CentOS
- 1.4GB Wikipedia Corpus 2-gram text input

1) 压缩率对比

2) 压缩、解压时间对比

3)总结

Compresion Ratio:bzip2 > gzip > lzo
Compresion speed:lzo > gzip > bzip2

6、使用场景

1)Split:
通常在生产中,我们不仅仅需要关注压缩的问题,更多情况下我们需要一个可以分割压缩方式
正如前面所说,一个500M的文件,只能由一个线程来读取,但是在大数据中我们更需要的是把500M进行了拆分,以便能达到在多台机器上并行读取分析的效果。
2)snappy\lzo\gzip\bzip2常见的压缩方式的各种功能

压缩格式 split,换成压缩格式后,原来的应用程序是否要修改 native 压缩率 速度 是否hadoop自带 linux命令 扩展名
gzip 否,和文本处理一样,不需要修改 很高 比较快 是,直接使用 .gz
lzo 是 ,需要建索引,还需要指定输入格式 比较高 很快 否,需要安装 .snappy
snappy 否 ,和文本处理一样,不需要修改 比较高 很快 否,需要安装 没有 .lzo
bzip2 是 ,和文本处理一样,不需要修改 最高 是,直接使用 .bz2

7、各种压缩版本验证实验(查看是否支持压缩功能)

1)查看当前安装的hadoop是否支持4中压缩

[hadoop@hadoop000 hadoop-2.6.0-cdh5.7.0]$ hadoop checknative
18/12/02 14:38:10 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop:  false 
zlib:    false 
snappy:  false 
lz4:     false 
bzip2:   false 
openssl: false 
18/12/02 14:38:11 INFO util.ExitUtil: Exiting with status 1

通常情况下需要本地编译,在$HADOOP_HOME/lib
下生成一个native目录,这个目录下会包含4中压缩的包

这个native可以自行编译生成,也可以拷贝别人编译好的native目录,移动完成后,重新检查

[hadoop@hadoop000 lib]$ cp -r ~/software/native ./
[hadoop@hadoop000 lib]$ hadoop checknative
18/12/02 14:47:11 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
18/12/02 14:47:11 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop:  true /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lib/native/libhadoop.so.1.0.0
zlib:    true /lib64/libz.so.1
snappy:  true /usr/lib64/libsnappy.so.1
lz4:     true revision:99
bzip2:   true /lib64/libbz2.so.1
openssl: false Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)!

此时已经支持这4中压缩方式了,我们也可以将native scp到其他节点

[hadoop@hadoop000 lib]$ scp -r native/ hadoop@hadoop001:~/app/hadoop-2.6.0-cdh5.7.0/lib/
[hadoop@hadoop000 lib]$ scp -r native/ hadoop@hadoop002:~/app/hadoop-2.6.0-cdh5.7.0/lib/

8 压缩在Hadoop中的应用,常见的codec

9、压缩在大数据中的应用



以上虽然展示的是MapReduce的三个阶段,但也是大数据通用的的三个阶段:

1)input(Map):

  • 大数据从HDFS读取数据
  • 如果你的文件很大,那么压缩将减少磁盘读取的消耗
  • 使用类似bzip2和lzo这种能够split的算法进行压缩(如果不能split那么只有一个task处理,可以split的方法能使用多task并行处理)

2)temp:中间转换

  • Map的输出是写入磁盘,并且通过网络传输
  • 使用compression目的就是为了减少写磁盘和网络传输的负载
  • 即使输入和输出没有进行压缩,只在中间使用了压缩,也能带来性能的提升
  • 使用快的压缩方式编码,如snappy、lzo,选用压缩快的方式是因为后续程序在等待数据进行后续处理,
    如果采用更高压缩比的方式,那么压缩时间和解压时间将会拖慢整个程序的执行时间

3)output(reducer):

  • mapreduce的输出通常是用来归档,或者作为下一个作业的输入(需要考虑能否分片)
  • 如果是归档,那么要使用高的压缩比来进行压缩,减少归档的空间
  • 如果是归档,那么要使用能够split的压缩方式进行压缩,一边提高下一次作业的并行度

分布式的主要思想就在于是否可以split

10 各种压缩在hadoop中的启用配置

1)设置集群中可能用到的压缩方式

core-site.xml

<property>
    <name>io.compression.codecs</name>
    <value>org.apache.hadoop.io.compress.GzipCodec,
        org.apache.hadoop.io.compress.DefaultCodec,
        org.apache.hadoop.io.compress.BZip2Codec,
        org.apache.hadoop.io.compress.SnappyCodec
    </value>
</property>

2)设置使用压缩方式的开关以及使用哪种压缩方式进行压缩

mapred-site.xml

<!-- 配置 Map段输出的压缩,snappy-->
<property>
  <name>mapreduce.map.output.compress</name>
  <value>true</value>
</property>

<property>
  <name>mapreduce.map.output.compress.codec</name>
  <value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<!-- 配置mapreduce最后一个阶段的输出压缩格式为bzip2 -->
<property>
    <name>mapreduce.output.fileoutputformat.compress</name>
    <value>true</value>
</property>

<property>
    <name>mapreduce.output.fileoutputformat.compress.codec</name>
    <value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>

3)实际操作,查看mapreduce的输出结果是不是BZip2格式

[hadoop@hadoop000 software]$ hdfs dfs -cat /data/helloword.txt
hello hello world welcome
hello world
hello
[hadoop@hadoop000 mapreduce]$ pwd
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce
[hadoop@hadoop000 mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /data/helloword.txt /data/wc/output/
[hadoop@hadoop000 ~]$ hdfs dfs -text /data/wc/output/*
18/12/02 17:25:55 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
18/12/02 17:25:55 INFO compress.CodecPool: Got brand-new decompressor [.bz2]
hello   4
welcome 1
world   2

编码:

conf.setBoolean("mapreduce.output.fileoutputformat.compress",true)
conf.setClass("xxx", BZip2Codec.class)   

codeobj , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【压缩方式对比】正确选择大数据处理过程中的压缩方式
喜欢 (0)
[a37free@163.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址