hadoop之文件压缩格式对比分析以及配置实现

1.大数据常见的压缩格式

压缩分为有损和无损两大类,生产中的压缩技术一定是无损压缩,具体常用的压缩格式以及压缩性能对比请参考:大数据常见压缩格式以及性能对比
分析:

压缩会从压缩比、压缩速度以及是否支持分片方面考虑
snappy:压缩速度最快,远高于别的压缩个是
gzip、bzip2:压缩比最高,约1/5
textFile(不压缩)、bzip2、LZO:支持文件分片,LZO默认不支持,创建索引后支持分片

2.压缩使用场景

2.1如何判定是否使用压缩?
  • 文件压缩对于大数据存储与计算是家常便饭,只要数据量达到一定级别,生产中就要考虑使用数据压缩
  • 压缩以及解压是高消耗cpu的过程,故若机器的负载load average很高时就不能使用压缩,资源不够可通过扩容快速解决。
2.2压缩在ETL作业生命周期在使用场景

1
分析: 多年经验

在整个ETL的过程中数据有三次是落在磁盘上:
elt源数据:这里重点考虑的是压缩后的文件支持分片,可选 textFile、LZO、bzip2
MAP输出数据:这里重点考虑数据,快速压缩以及解压,直接选snappy
Reduce输出数据:若输出数据只是为了存储保留,应选压缩比高的(gzip、bzip2),若输出数据为下一个作业的MAP输入,应选择支持分片。

3.文件压缩配置实现

3.1 确保hadoop支持压缩
[hadoop@hadoop001 ~]$ hadoop checknative
19/04/13 22:06:01 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
19/04/13 22:06:01 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: true /usr/lib64/libcrypto.so

true表示支持压缩,若不支持压缩,需重新部署可支持压缩的hadoop,可参考:hadoop-2.6.0-cdh5.7.0源码编译支持压缩以及伪分布式部署

3.2修改hadoop配置文件
  • 修改core-site的配置文件,添加支持的压缩格式
   <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>
  • 设置map以及reduce输出文件的压缩格式
<!--开启map阶段文件压缩-->
<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输出文件压缩-->
<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>
  • 重启hadoop
[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ stop-all.sh 
[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ start-all.sh 
[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ jps
17291 Jps
16873 ResourceManager
16438 NameNode
16538 DataNode
16724 SecondaryNameNode
16974 NodeManager
  • WC测试压缩是否有效
#WC输入源数据如下
[hadoop@hadoop001 data]$ hdfs dfs  -text   /data/wc/input/input.txt
hello	word	wsk
hello	hello	wor	wsk
ruo	ze
ha	wsk
#运行词频统计MR
hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar \
wordcount /data/wc/input/  /data/wc/output/
#观看输出文件后缀,确实是.bz2结尾
[hadoop@hadoop001 data]$ hdfs dfs  -ls  /data/wc/output
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2019-04-14 01:44 /data/wc/output/_SUCCESS
-rw-r--r--   1 hadoop supergroup         68 2019-04-14 01:44 /data/wc/output/part-r-00000.bz2
#查看压缩文件
[hadoop@hadoop001 data]$ hdfs dfs  -text  /data/wc/output/part*
19/04/14 01:59:19 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
19/04/14 01:59:19 INFO compress.CodecPool: Got brand-new decompressor [.bz2]
ha	1
hello	3
ruo	1
wor	1
word	1
wsk	3
ze	1

注意:这些配置在hadoop官方的配置文件中都可以查到,官方默认不开启压缩

4.hive文件压缩配置实现

hive官网上压缩的讲解可查阅hive官方文档
SET hive.exec.compress.output=true #开启压缩
SET mapreduce.output.fileoutputformat.compress.codec=codec-class #为是core-site.xml中配置某个压缩类

4.1 原测试数据大小
#大小为19M,实际是18.1M,应该是linux进1计数了
[hadoop@hadoop001 click]$ du -sh ~/data/click/page_views.dat 
19M	/home/hadoop/data/click/page_views.dat

#网盘连接
链接:https://pan.baidu.com/s/1SdW8Nkx-mvrSaoQ2A0U6jA 
提取码:o5pn
4.2文件不压缩
#查看压缩格式。false表示不压缩
hive> SET hive.exec.compress.output;
hive.exec.compress.output=false

#创建page_views表
create table page_views(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
) row format delimited fields terminated by '\t';

#加载数据
LOAD DATA LOCAL INPATH '/home/hadoop/data/click/page_views.dat' OVERWRITE INTO TABLE page_views;

#查看hdfs文件大小
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views/
18.1 M  18.1 M  /user/hive/warehouse/wsktest.db/page_views/page_views.dat

与原文件大小一致

4.2文件采用bzip2压缩
#开启压缩,设置压缩格式为bzip2,默认是Bzip,因为我的hdoop配置的是bzip2
hive> SET hive.exec.compress.output=true;
hive> SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;

#加载数据
create table page_views_bzip2
as select * from page_views;

#查看hdfs文件大小
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_bzip2/*
3.6 M  3.6 M  /user/hive/warehouse/wsktest.db/page_views_bzip2/000000_0.bz2

大小约为源文件的1/5

4.3文件采用压缩gzip压缩
#开启压缩,设置压缩格式为bzip2,默认是Bzip,因为我的hdoop配置的是bzip2
hive> SET hive.exec.compress.output=true;
hive> set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;

#加载数据
create table page_views_bzip2
as select * from page_views;

#查看hdfs文件大小
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_gzip/*
5.3 M  5.3 M  /user/hive/warehouse/wsktest.db/page_views_gzip/000000_0.gz

大小约为源文件的1/3

扩展1:hadoop checknative 虽然没没显示gzip、LZO压缩格式是否支持,是因为检查的是native,只要本机有gzip和LZO相关软件即可

扩展2:hadoop配置文件配置的压缩格式是表示job未指明压缩格式时默认的压缩格式,每个MR作业都可单独指定特定压缩格式,如使用代码指定,hive配置指定

猜你喜欢

转载自blog.csdn.net/qq_32641659/article/details/89337897