使用数据压缩好处是可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,尤其文本文件一般压缩率可以高达40%左右,对于集群来说带宽是稀有资源,所有网络传输性能的提升很重要 。但是使用压缩和解压缩会增加CPU的开销。
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压缩方法。
<property>
<name>io.compression.codecs</name>
<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>
</property>
可以通过如下命令查看hive中已经配置好的压缩算法。使用set命令可以查看所有hive配置文件中的属性值以及hive安装环境的hadoop文件的属性值。hive中默认压缩是关闭的,可以通过set hive.exec.compress.output来查看
hive (fdm_sor)> set io.compression.codecs;
io.compression.codecs=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
如上查询的结果是对应的算法在hadoop底层的类,为什么要有不同压缩算法呢?主要是因为不同的压缩算法在压缩率和压缩时间,压缩的文件是否可切分等方面都不同,实际开发中需要根据实际情况权衡使用。
压缩格式 | 对应的类 | 文件扩展名 | 是否支持多文件 | 文件可分割性 |
DEFLATE (默认) | org.apache.hadoop.io.compress.DefaultCodec | .deflate | 不 | 不 |
gzip | org.apache.hadoop.io.compress.GzipCodec | .gz | 不 | 不 |
bzip2 | org.apache.hadoop.io.compress.BZip2Codec | .bz2 | 不 | 是 |
LZO | com.hadoop.compression.lzo.LzopCodec | .lzo_deflate | 不 | 是 |
Lzop | com.hadoop.compression.lzo.LzopCodec; | .lzo | 不 | 是 |
三.HIVE中压缩算法性能分析
这里测试的表中文件是516.4MB,hadoop环境的块设置大小是256Mb,正好这样数据存储是分块存储,计算有IO的开销。可以测算不同压缩算法下数据传输计算的时间,以及压缩率等因子。
[robot~]hadoop fs -du h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901
516.4 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901/201901.txt
这是直接从linux本地load的文件到hdfs上,文件实际数据大小是516.4Mb
1.hive中不使用压缩,进行计算与存储
--1.无压缩算法下进行数据存储计算。
set hive.exec.compress.output=false; --默认就是false的
insert overwrite table t_fin_demo partition(staits_date ='201900')
select
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';
2.使用du -h命令查看hdfs上文件存储情况
[finance@master2-dev software]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900
271.0 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000000_0
271.0 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000001_0
4.7 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000002_0
3.程序运行时间
Total MapReduce CPU Time Spent: 54 seconds 200 msec
Time taken: 36.445 seconds
总结:从上面数据看出,无压缩模式下,数据存储的格式就是文本格式,无后缀名,可以直接从-cat查看。文件存储大小是原本文件的大小271+271+4.7=546.7Mb,运行时间是36.445。
2.使用hive默认的压缩方式,hive存储的文件后缀是.deflate
1.使用deflate进行压缩
set hive.exec.compress.output=true;
--true是开启压缩,默认是关闭的,如果开启后不指定压缩方式,默认使用defalte。
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec;
insert overwrite table t_fin_demo partition(staits_date ='201904')
select
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';
2.查看数据存储和计算情况
[finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903
75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000000_0.deflate
75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000001_0.deflate
1.3 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000002_0.deflate
3.程序耗时时间:
Time taken: 54.659 seconds
总结:上面数据看,使用默认的的deflate压缩算法,数据存储文件后缀名为.deflate.文件存储的大小是:75.9+75.9+1.3=153.1。程序耗时是54.659s.可以看出deflate压缩的压缩率很高,但是程序耗时相比不压缩有所上升。
3.使用gzip进行压缩,hive中文件后缀是.gz
1.使用Gzip进行压缩存储
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec;
insert overwrite table t_fin_demo partition(staits_date ='201904')
select
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';
2.使用du -h命令查看hdfs上文件存储情况
[finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904
75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000000_0.gz
75.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000001_0.gz
1.3 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000002_0.gz
3.程序运行时间
Total MapReduce CPU Time Spent: 1 minutes 33 seconds 430 msec
OK
Time taken: 62.436 seconds
总结:上面数据看,使用默认的的gzip压缩算法,数据存储文件后缀名为.gz文件存储的大小是:75.9+75.9+1.3=153.1。程序耗时是62.436.如果下载到windows本地解压后可读
4.使用lzo压缩算法进行压缩,文件后缀是.lzo_deflate
1.使用lzo进行压缩存储
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;
insert overwrite table t_fin_demo partition(staits_date ='201905')
select
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';
2.使用du -h命令查看hdfs上文件存储情况
[finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905
121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000000_0.lzo_deflate
121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000001_0.lzo_deflate
2.1 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000002_0.lzo_deflate
3.程序运行时间
Total MapReduce CPU Time Spent: 58 seconds 700 msec
OK
Time taken: 42.45 seconds
总结:上面数据看,使用默认的的lzo压缩算法,数据存储文件后缀名为.lzo_deflate.文件存储的大小是:121.9+121.9+2.1=245.9。程序耗时是42.45s。
5.使用Lzop压缩方式,hive存储的文件后缀是.lzo
1.使用lzop进行压缩存储
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;
insert overwrite table t_fin_demo partition(staits_date ='201906')
select
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';
2.使用du -h命令查看hdfs上文件存储情况
[finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906
121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000000_0.lzo
121.9 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000001_0.lzo
2.1 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000002_0.lzo
3.程序运行时间
Total MapReduce CPU Time Spent: 47 seconds 280 msec
OK
Time taken: 34.439 seconds
总结:上面数据看,使用默认的的Lzop压缩算法,数据存储文件后缀名为.lzo。文件存储的大小是:121.9+121.9+2.1=245.9。程序耗时是34.439s。
6.使用BZip2压缩方式,hive存储的文件后缀是.bz2
1.使用Bzip2进行压缩存储
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
insert overwrite table t_fin_demo partition(staits_date ='201907')
select
name,
id_type,
idcard,
org,
loan_no,
busi_type,
busi_category,
open_date,
dure_date,
loan_amount,
happen_time,
amout,
due_amt,
stat
from t_fin_demo where staits_date ='201901';
2.使用du -h命令查看hdfs上文件存储情况
[finance@master2-dev hadoop]$ hadoop fs -du -h /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907
52.5 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000000_0.bz2
52.5 M /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000001_0.bz2
935.2 K /user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000002_0.bz2
3.程序运行时间
Total MapReduce CPU Time Spent: 2 minutes 47 seconds 530 msec
OK
Time taken: 96.42 seconds
总结:上面数据看,使用默认的的Bzip2压缩算法,数据存储文件后缀名为.bz2。文件存储的大小是:52.5+52.5+0.934=106Mb。程序耗时是96.42s
各种压缩算法综合分析
压缩方式 | 原文件大小 | 压缩后文件 | 运行时间 | 备注 |
不使用压缩 | 516.4Mb | 546.70Mb | 36.445s |
|
defalte(默认压缩) | 516.4Mb | 153.16Mb | 54.659s | 压缩率高 |
lzo压缩 | 516.4Mb | 245.90Mb | 42.45s | LZO压缩和解压缩很快,但是压缩的文件较大 |
Lzop压缩 | 516.4Mb | 249.90Mb | 34.439s | LZOP压缩和解压缩很快,但是压缩的文件较大 |
gzip压缩 | 516.4Mb | 153.16Mb | 62.436s | GZip 和 BZip2压缩可以保证最小的压缩文件,但是过于消耗时间,非常不适合CPU型运算。 |
Bzip2压缩 | 516.4Mb | 106.00Mb | 96.42s | GZip 和 BZip2压缩可以保证最小的压缩文件,但是过于消耗时间,不适合CPU型运算。 |
综合上表可以看出,每种压缩算法都有自己的优缺点。具体使用哪种压缩取决于具体存储的数据格式与计算模式有关。具体压缩使用与原理参考后续博客。
1.就压缩比来说:bzip2>gzip>deflate>lzo,故bzip2最节省存储空间,但是耗时高哇。
2.解压速度和耗时:lzo>deflate>gzip>bzip2
本文转载自微信公众号「涤生大数据」,作者「涤生大数据」,可以通过以下二维码关注。
转载本文请联系「涤生大数据」公众号。