Hive中压缩使用详解与性能分析

     HIVE底层是hdfs和mapreduce实现存储和计算的。所以HIVE可以使用hadoop自带的InputFormat和Outputformat实现从不同的数据源读取文件和写出不同格式的文件到文件系统中。同理,HIVE也可以使用hadoop配置的压缩方法对中间结果或最终数据进行压缩。

1.什么是压缩及优劣?

       hive中数据做压缩和解压缩跟windows下的数据压缩差不错,同样有很多中压缩算法,结果是以不同的后缀名区别。使用数据压缩好处是可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,尤其文本文件一般压缩率可以高达40%左右,对于集群来说带宽是稀有资源,所有网络传输性能的提升很重要 。但是使用压缩和解压缩会增加CPU的开销。

     所以具体使不使用数据压缩,具体取决于job类型:对那些I/O密集型的作业使用数据压缩,cpu密集型,使用压缩反而会降低性能。不过对于作业的类型的判断,只能通过实际测量对比执行结果去分析。

2.HIVE中常见的压缩算法

      注意,注意,注意,hive中的压缩算法主要取决于hadoop版本。不同的版本会系统不同的压缩编码和解码器。比如我们公司目前使用的hadoop2.9版本已经支持了很多种压缩方式,版本越高支持的压缩方式越多。可以在hadoop下的core-site.xm文件中配置压缩方式,hive使用的也是这个配置文件。如下是我集群中配置的的压缩方式,实际开发中可以根据自己需求配置压缩方式。当然如果不配置的话,默认则不会使用压缩。比如我们公司就没有配置使用snappy压缩方法。


 
 
  1. <property>
  2. <name>io.compression.codecs </name>
  3. <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.BZip2Codec </value>
  4. </property>

可以通过如下命令查看hive中已经配置好的压缩算法。使用set命令可以查看所有hive配置文件中的属性值以及hive安装环境的hadoop文件的属性值。hive中默认压缩是关闭的,可以通过set hive.exec.compress.output来查看


 
 
  1. hive (fdm_sor)> set io.compression.codecs;
  2. io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec,
  3. org.apache.hadoop.io.compress.DefaultCodec,
  4. com.hadoop.compression.lzo.LzoCodec,
  5. com.hadoop.compression.lzo.LzopCodec,
  6. org.apache.hadoop.io.compress.BZip2Codec

     如上查询的结果是对应的算法在hadoop底层的类,为什么要有不同压缩算法呢?主要是因为不同的压缩算法在压缩率和压缩时间,压缩的文件是否可切分等方面都不同,实际开发中需要根据实际情况权衡使用。   

 压缩格式             对应的类 文件扩展名 是否支持多文件 文件可分割性

 DEFLATE

		<p>(默认)</p>
		</td>
		<td style="width:266px;">&nbsp;org.apache.hadoop.io.compress.DefaultCodec</td>
		<td style="width:103px;">&nbsp;.deflate</td>
		<td style="width:137px;">&nbsp;不</td>
		<td style="width:138px;">&nbsp;不</td>
	</tr><tr><td style="width:125px;">&nbsp;gzip</td>
		<td style="width:266px;">org.apache.hadoop.io.compress.GzipCodec</td>
		<td style="width:103px;">&nbsp;.gz</td>
		<td style="width:137px;">&nbsp;不</td>
		<td style="width:138px;">&nbsp;不</td>
	</tr><tr><td style="width:125px;">&nbsp;bzip2</td>
		<td style="width:266px;">org.apache.hadoop.io.compress.BZip2Codec</td>
		<td style="width:103px;">&nbsp;.bz2</td>
		<td style="width:137px;">&nbsp;不</td>
		<td style="width:138px;">&nbsp;是</td>
	</tr><tr><td style="width:125px;">&nbsp;LZO</td>
		<td style="width:266px;">&nbsp;com.hadoop.compression.lzo.LzopCodec</td>
		<td style="width:103px;">&nbsp;.lzo_deflate</td>
		<td style="width:137px;">&nbsp;不</td>
		<td style="width:138px;">&nbsp;是</td>
	</tr><tr><td style="width:125px;">Lzop</td>
		<td style="width:266px;">com.hadoop.compression.lzo.LzopCodec;</td>
		<td style="width:103px;">.lzo</td>
		<td style="width:137px;">&nbsp;不</td>
		<td style="width:138px;">&nbsp;是</td>
	</tr></tbody></table></div><h2><a name="t2"></a><a name="t2"></a>三.HIVE中压缩算法性能分析</h2>

       这里测试的表中文件是516.4MB,hadoop环境的块设置大小是256Mb,正好这样数据存储是分块存储,计算有IO的开销。可以测算不同压缩算法下数据传输计算的时间,以及压缩率等因子。


 
 
  1. [robot~]hadoop fs -du h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901
  2. 516.4 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901/201901.txt
  3. 这是直接从linux本地 load的文件到hdfs上,文件实际数据大小是 516.4Mb

1.hive中不使用压缩,进行计算与存储


 
 
  1. --1.无压缩算法下进行数据存储计算。
  2. set hive.exec.compress.output= false; --默认就是false的
  3. insert overwrite table t_fin_demo partition(staits_date = '201900')
  4. select
  5. name,
  6. id_type,
  7. idcard,
  8. org,
  9. loan_no,
  10. busi_type,
  11. busi_category,
  12. open_date,
  13. dure_date,
  14. loan_amount,
  15. happen_time,
  16. amout,
  17. due_amt,
  18. stat
  19. from t_fin_demo where staits_date = '201901';
  20. 2.使用du -h命令查看hdfs上文件存储情况
  21. [finance@master2-dev software]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900
  22. 271.0 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000000_0
  23. 271.0 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000001_0
  24. 4.7 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000002_0
  25. 3.程序运行时间
  26. Total MapReduce CPU Time Spent: 54 seconds 200 msec
  27. Time taken: 36.445 seconds

 总结:从上面数据看出,无压缩模式下,数据存储的格式就是文本格式,无后缀名,可以直接从-cat查看。文件存储大小是原本文件的大小271+271+4.7=546.7Mb,运行时间是36.445。

2.使用hive默认的压缩方式,hive存储的文件后缀是.deflate


 
 
  1. 1.使用deflate进行压缩
  2. set hive.exec.compress.output= true;
  3. --true是开启压缩,默认是关闭的,如果开启后不指定压缩方式,默认使用defalte。
  4. set  mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec;
  5. insert overwrite table t_fin_demo partition(staits_date = '201904')
  6. select
  7. name,
  8. id_type,
  9. idcard,
  10. org,
  11. loan_no,
  12. busi_type,
  13. busi_category,
  14. open_date,
  15. dure_date,
  16. loan_amount,
  17. happen_time,
  18. amout,
  19. due_amt,
  20. stat
  21. from t_fin_demo where staits_date = '201901';
  22. 2.查看数据存储和计算情况
  23. [finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903
  24. 75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000000_0.deflate
  25. 75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000001_0.deflate
  26. 1.3 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000002_0.deflate
  27. 3.程序耗时时间:
  28. Time taken: 54.659 seconds

总结:上面数据看,使用默认的的deflate压缩算法,数据存储文件后缀名为.deflate.文件存储的大小是:75.9+75.9+1.3=153.1。程序耗时是54.659s.可以看出deflate压缩的压缩率很高,但是程序耗时相比不压缩有所上升。

3.使用gzip进行压缩,hive中文件后缀是.gz


 
 
  1. 1.使用Gzip进行压缩存储
  2. set hive.exec.compress.output= true;
  3. set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
  4. insert overwrite table t_fin_demo partition(staits_date = '201904')
  5. select
  6. name,
  7. id_type,
  8. idcard,
  9. org,
  10. loan_no,
  11. busi_type,
  12. busi_category,
  13. open_date,
  14. dure_date,
  15. loan_amount,
  16. happen_time,
  17. amout,
  18. due_amt,
  19. stat
  20. from t_fin_demo where staits_date = '201901';
  21. 2.使用du -h命令查看hdfs上文件存储情况
  22. [finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904
  23. 75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000000_0.gz
  24. 75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000001_0.gz
  25. 1.3 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000002_0.gz
  26. 3.程序运行时间
  27. Total MapReduce CPU Time Spent: 1 minutes 33 seconds 430 msec
  28. OK
  29. Time taken: 62.436 seconds

总结:上面数据看,使用默认的的gzip压缩算法,数据存储文件后缀名为.gz文件存储的大小是:75.9+75.9+1.3=153.1。程序耗时是62.436.如果下载到windows本地解压后可读

4.使用lzo压缩算法进行压缩,文件后缀是.lzo_deflate


 
 
  1. 1.使用lzo进行压缩存储
  2. set hive.exec.compress.output= true;
  3. set mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;
  4. insert overwrite table t_fin_demo partition(staits_date = '201905')
  5. select
  6. name,
  7. id_type,
  8. idcard,
  9. org,
  10. loan_no,
  11. busi_type,
  12. busi_category,
  13. open_date,
  14. dure_date,
  15. loan_amount,
  16. happen_time,
  17. amout,
  18. due_amt,
  19. stat
  20. from t_fin_demo where staits_date = '201901';
  21. 2.使用du -h命令查看hdfs上文件存储情况
  22. [finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905
  23. 121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000000_0.lzo_deflate
  24. 121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000001_0.lzo_deflate
  25. 2.1 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000002_0.lzo_deflate
  26. 3.程序运行时间
  27. Total MapReduce CPU Time Spent: 58 seconds 700 msec
  28. OK
  29. Time taken: 42.45 seconds

总结:上面数据看,使用默认的的lzo压缩算法,数据存储文件后缀名为.lzo_deflate.文件存储的大小是:121.9+121.9+2.1=245.9。程序耗时是42.45s。

5.使用Lzop压缩方式,hive存储的文件后缀是.lzo


 
 
  1. 1.使用lzop进行压缩存储
  2. set hive.exec.compress.output= true;
  3. set mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;
  4. insert overwrite table t_fin_demo partition(staits_date = '201906')
  5. select
  6. name,
  7. id_type,
  8. idcard,
  9. org,
  10. loan_no,
  11. busi_type,
  12. busi_category,
  13. open_date,
  14. dure_date,
  15. loan_amount,
  16. happen_time,
  17. amout,
  18. due_amt,
  19. stat
  20. from t_fin_demo where staits_date = '201901';
  21. 2.使用du -h命令查看hdfs上文件存储情况
  22. [finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906
  23. 121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000000_0.lzo
  24. 121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000001_0.lzo
  25. 2.1 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000002_0.lzo
  26. 3.程序运行时间
  27. Total MapReduce CPU Time Spent: 47 seconds 280 msec
  28. OK
  29. Time taken: 34.439 seconds

总结:上面数据看,使用默认的的Lzop压缩算法,数据存储文件后缀名为.lzo。文件存储的大小是:121.9+121.9+2.1=245.9。程序耗时是34.439s。

6.使用BZip2压缩方式,hive存储的文件后缀是.bz2


 
 
  1. 1.使用Bzip2进行压缩存储
  2. set hive.exec.compress.output= true;
  3. set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
  4. insert overwrite table t_fin_demo partition(staits_date = '201907')
  5. select
  6. name,
  7. id_type,
  8. idcard,
  9. org,
  10. loan_no,
  11. busi_type,
  12. busi_category,
  13. open_date,
  14. dure_date,
  15. loan_amount,
  16. happen_time,
  17. amout,
  18. due_amt,
  19. stat
  20. from t_fin_demo where staits_date = '201901';
  21. 2.使用du -h命令查看hdfs上文件存储情况
  22. [finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907
  23. 52.5 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000000_0.bz2
  24. 52.5 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000001_0.bz2
  25. 935.2 K /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000002_0.bz2
  26. 3.程序运行时间
  27. Total MapReduce CPU Time Spent: 2 minutes 47 seconds 530 msec
  28. OK
  29. Time taken: 96.42 seconds

总结:上面数据看,使用默认的的Bzip2压缩算法,数据存储文件后缀名为.bz2。文件存储的大小是:52.5+52.5+0.934=106Mb。程序耗时是96.42s

各种压缩算法综合分析

压缩方式原文件大小压缩后文件运行时间备注
不使用压缩516.4Mb546.70Mb36.445s 
defalte(默认压缩)516.4Mb153.16Mb54.659s压缩率高
lzo压缩516.4Mb245.90Mb42.45sLZO压缩和解压缩很快,但是压缩的文件较大
Lzop压缩516.4Mb249.90Mb34.439sLZOP压缩和解压缩很快,但是压缩的文件较大
gzip压缩516.4Mb153.16Mb62.436sGZip 和 BZip2压缩可以保证最小的压缩文件,但是过于消耗时间,非常不适合CPU型运算。
Bzip2压缩516.4Mb106.00Mb96.42s GZip 和 BZip2压缩可以保证最小的压缩文件,但是过于消耗时间,不适合CPU型运算。

综合上表可以看出,每种压缩算法都有自己的优缺点。具体使用哪种压缩取决于具体存储的数据格式与计算模式有关。具体压缩使用与原理参考后续博客。

1.就压缩比来说:bzip2>gzip>deflate>lzo,故bzip2最节省存储空间,但是耗时高哇。

2.解压速度和耗时:lzo>deflate>gzip>bzip2   lzo解压速度是最快的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值