1.大数据常见的压缩格式
压缩分为有损和无损两大类,生产中的压缩技术一定是无损压缩,具体常用的压缩格式以及压缩性能对比请参考:大数据常见压缩格式以及性能对比
分析:
压缩会从压缩比、压缩速度以及是否支持分片方面考虑snappy:压缩速度最快,远高于别的压缩个是gzip、bzip2:压缩比最高,约1/5textFile(不压缩)、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、bzip2MAP输出数据:这里重点考虑数据,快速压缩以及解压,直接选snappyReduce输出数据:若输出数据只是为了存储保留,应选压缩比高的(gzip、bzip2),若输出数据为下一个作业的MAP输入,应选择支持分片。
3.文件压缩配置实现
3.1 确保hadoop支持压缩
[hadoop@hadoop001 ~]$ hadoop checknative19/04/13 22:06:01 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native19/04/13 22:06:01 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib libraryNative library checking:hadoop: true /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lib/native/libhadoop.so.1.0.0zlib: true /lib64/libz.so.1snappy: true /usr/lib64/libsnappy.so.1lz4: true revision:99bzip2: true /lib64/libbz2.so.1openssl: 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]$ jps17291 Jps16873 ResourceManager16438 NameNode16538 DataNode16724 SecondaryNameNode16974 NodeManager
- WC测试压缩是否有效
#WC输入源数据如下[hadoop@hadoop001 data]$ hdfs dfs -text /data/wc/input/input.txthello word wskhello hello wor wskruo zeha wsk#运行词频统计MRhadoop 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/outputFound 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-native19/04/14 01:59:19 INFO compress.CodecPool: Got brand-new decompressor [.bz2]ha 1hello 3ruo 1wor 1word 1wsk 3ze 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.dat19M /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配置的是bzip2hive> SET hive.exec.compress.output=true;hive> SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;#加载数据create table page_views_bzip2as 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配置的是bzip2hive> SET hive.exec.compress.output=true;hive> set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;#加载数据create table page_views_bzip2as 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配置指定
