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

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

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

2.压缩使用场景

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

2.2压缩在ETL作业生命周期在使用场景

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdfGOj8v-1607521689055)(https://s2.ax1x.com/2019/04/14/AXYhSe.md.png)]
分析: 多年经验

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

3.文件压缩配置实现

3.1 确保hadoop支持压缩
  1. [hadoop@hadoop001 ~]$ hadoop checknative
  2. 19/04/13 22:06:01 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
  3. 19/04/13 22:06:01 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
  4. Native library checking:
  5. hadoop: true /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lib/native/libhadoop.so.1.0.0
  6. zlib: true /lib64/libz.so.1
  7. snappy: true /usr/lib64/libsnappy.so.1
  8. lz4: true revision:99
  9. bzip2: true /lib64/libbz2.so.1
  10. openssl: true /usr/lib64/libcrypto.so

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

3.2修改hadoop配置文件
  • 修改core-site的配置文件,添加支持的压缩格式
  1. <property>
  2. <name>io.compression.codecs</name>
  3. <value>org.apache.hadoop.io.compress.GzipCodec,
  4. org.apache.hadoop.io.compress.DefaultCodec,
  5. org.apache.hadoop.io.compress.BZip2Codec,
  6. org.apache.hadoop.io.compress.SnappyCodec
  7. </value>
  8. </property>
  • 设置map以及reduce输出文件的压缩格式
  1. <!--开启map阶段文件压缩-->
  2. <property>
  3. <name>mapreduce.map.output.compress</name>
  4. <value>true</value>
  5. </property>
  6. <property>
  7. <name>mapreduce.map.output.compress.codec</name>
  8. <value>org.apache.hadoop.io.compress.SnappyCodec</value>
  9. </property>
  10. <!--开启MapReduce输出文件压缩-->
  11. <property>
  12. <name>mapreduce.output.fileoutputformat.compress</name>
  13. <value>true</value>
  14. </property>
  15. <property>
  16. <name>mapreduce.output.fileoutputformat.compress.codec</name>
  17. <value>org.apache.hadoop.io.compress.BZip2Codec</value>
  18. </property>
  • 重启hadoop
  1. [hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ stop-all.sh
  2. [hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ start-all.sh
  3. [hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ jps
  4. 17291 Jps
  5. 16873 ResourceManager
  6. 16438 NameNode
  7. 16538 DataNode
  8. 16724 SecondaryNameNode
  9. 16974 NodeManager
  • WC测试压缩是否有效
  1. #WC输入源数据如下
  2. [hadoop@hadoop001 data]$ hdfs dfs -text /data/wc/input/input.txt
  3. hello word wsk
  4. hello hello wor wsk
  5. ruo ze
  6. ha wsk
  7. #运行词频统计MR
  8. 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 \
  9. wordcount /data/wc/input/ /data/wc/output/
  10. #观看输出文件后缀,确实是.bz2结尾
  11. [hadoop@hadoop001 data]$ hdfs dfs -ls /data/wc/output
  12. Found 2 items
  13. -rw-r--r-- 1 hadoop supergroup 0 2019-04-14 01:44 /data/wc/output/_SUCCESS
  14. -rw-r--r-- 1 hadoop supergroup 68 2019-04-14 01:44 /data/wc/output/part-r-00000.bz2
  15. #查看压缩文件
  16. [hadoop@hadoop001 data]$ hdfs dfs -text /data/wc/output/part*
  17. 19/04/14 01:59:19 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
  18. 19/04/14 01:59:19 INFO compress.CodecPool: Got brand-new decompressor [.bz2]
  19. ha 1
  20. hello 3
  21. ruo 1
  22. wor 1
  23. word 1
  24. wsk 3
  25. 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 原测试数据大小
  1. #大小为19M,实际是18.1M,应该是linux进1计数了
  2. [hadoop@hadoop001 click]$ du -sh ~/data/click/page_views.dat
  3. 19M /home/hadoop/data/click/page_views.dat
  4. #网盘连接
  5. 链接:https://pan.baidu.com/s/1SdW8Nkx-mvrSaoQ2A0U6jA
  6. 提取码:o5pn

4.2文件不压缩
  1. #查看压缩格式。false表示不压缩
  2. hive> SET hive.exec.compress.output;
  3. hive.exec.compress.output=false
  4. #创建page_views表
  5. create table page_views(
  6. track_time string,
  7. url string,
  8. session_id string,
  9. referer string,
  10. ip string,
  11. end_user_id string,
  12. city_id string
  13. ) row format delimited fields terminated by '\t';
  14. #加载数据
  15. LOAD DATA LOCAL INPATH '/home/hadoop/data/click/page_views.dat' OVERWRITE INTO TABLE page_views;
  16. #查看hdfs文件大小
  17. [hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views/
  18. 18.1 M 18.1 M /user/hive/warehouse/wsktest.db/page_views/page_views.dat

与原文件大小一致

4.2文件采用bzip2压缩
  1. #开启压缩,设置压缩格式为bzip2,默认是Bzip,因为我的hdoop配置的是bzip2
  2. hive> SET hive.exec.compress.output=true;
  3. hive> SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
  4. #加载数据
  5. create table page_views_bzip2
  6. as select * from page_views;
  7. #查看hdfs文件大小
  8. [hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_bzip2/*
  9. 3.6 M 3.6 M /user/hive/warehouse/wsktest.db/page_views_bzip2/000000_0.bz2

大小约为源文件的1/5

4.3文件采用压缩gzip压缩
  1. #开启压缩,设置压缩格式为bzip2,默认是Bzip,因为我的hdoop配置的是bzip2
  2. hive> SET hive.exec.compress.output=true;
  3. hive> set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
  4. #加载数据
  5. create table page_views_bzip2
  6. as select * from page_views;
  7. #查看hdfs文件大小
  8. [hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_gzip/*
  9. 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配置指定