1.大数据常见的压缩格式
压缩分为有损和无损两大类,生产中的压缩技术一定是无损压缩,具体常用的压缩格式以及压缩性能对比请参考:大数据常见压缩格式以及性能对比
分析:
压缩会从压缩比、压缩速度以及是否支持分片方面考虑
snappy:压缩速度最快,远高于别的压缩个是
gzip、bzip2:压缩比最高,约1/5
textFile(不压缩)、bzip2、LZO:支持文件分片,LZO默认不支持,创建索引后支持分片
2.压缩使用场景
2.1如何判定是否使用压缩?
- 文件压缩对于大数据存储与计算是家常便饭,只要数据量达到一定级别,生产中就要考虑使用数据压缩
- 压缩以及解压是高消耗cpu的过程,故若机器的负载load average很高时就不能使用压缩,资源不够可通过扩容快速解决。
2.2压缩在ETL作业生命周期在使用场景
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdfGOj8v-1607521689055)(https://s2.ax1x.com/2019/04/14/AXYhSe.md.png)]
分析: 多年经验
在整个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配置指定