HIVE底层是hdfs和mapreduce进行存储和计算。因此,HIVE可以使用Hadoop自带的InputFormat和Outputformat从不同的数据源读取文件,将不同格式的文件写入文件系统。同样,HIVE也可以使用hadoop配置的压缩方式,对中间结果或最终数据进行压缩。1、什么是压缩及其优缺点?hive中数据的压缩和解压不如windows下的数据压缩。压缩算法也有很多,其结果通过不同的后缀名来区分。使用数据压缩的好处是可以最大限度地减少文件所需的磁盘空间和网络I/O的开销,尤其是文本文件一般压缩率可以高达40%左右。带宽对于集群来说是一种稀缺资源,所有网络传输性能的提升都很重要。但是使用压缩和解压会增加CPU的开销。因此,数据压缩的具体使用取决于作业的类型:对那些I/O密集型作业、cpu密集型作业使用数据压缩,使用压缩会降低性能。但是,工作类型的判断只能通过实际测量和执行结果的比较来分析。2、HIVE中常用的压缩算法Attention,attention,attention,hive中的压缩算法主要看hadoop版本。不同的版本会有不同的压缩编解码器和解码器。比如我们公司目前使用的Hadoop2.9版本已经支持很多压缩方式,而且版本越高支持的压缩方式越多。可以在hadoop下的core-site.xm文件中配置压缩方式,这个配置文件也是hive使用的。下面是我的集群配置的压缩方式。在实际开发中,可以根据自己的需要配置压缩方式。当然,如果不配置,默认不会使用压缩。比如我们公司没有配置使用snappy压缩方式。<属性><名称>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可以使用如下命令查看hive中配置的压缩算法。使用set命令查看所有hive配置文件中的属性值和hive安装环境下hadoop文件的属性值。hive中默认压缩是关闭的,可以通过sethive.exec.compress.outputhive(fdm_sor)>setio.compression.codecs;io.compression.codecs=org.apache.hadoop.io查看hive(fdm_sor).compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.BZip2Codec结果上面query对应的算法在hadoop的底层,为什么要有不同的压缩算法呢?主要原因是不同的压缩算法在压缩率和压缩时间、压缩后的文件是否可以拆分等方面都不一样,实际开发需要根据实际情况权衡。压缩格式对应的类文件扩展名是否支持多文件文件分割bzip2org.apache.hadoop.io.compress.BZip2Codec.bz2isnotLZOcom.hadoop.compression.lzo.LzopCodec.lzo_deflateisnotLzopcom.hadoop.compression.lzo.LzopCodec;.lzoisnot3.HIVE中的压缩算法性能分析这里测试的表中的文件是516.4MB,hadoop环境的blocksize是256Mb。就这样,数据存储分块,计算有IO开销。可以衡量不同压缩算法下数据传输的计算时间,以及压缩比等因素。[robot~]hadoopfs-duh/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901516.4M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201901/201901.txt这是直接从linux本地加载的文件到hdfs。该文件的实际数据大小为516.4Mb。1、Hive不使用压缩进行计算和存储--1、数据存储计算不使用压缩算法。设置hive.exec.compress.output=false;--默认为falseinsertoverwritetablet_fin_demopartition(staits_date='201900')selectname,id_type,idcard,org,loan_no,busi_type,busi_category,open_date,dure_date,loan_amount,happen_time,amout,due_amt,statfromt_fin_demowherestaits_date='201901';2.使用du-h命令查看hdfs上的文件存储[finance@master2-dev软件]$hadoopfs-du-h/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900271.0M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000000_0271.0M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201900/000001_04.7M/user/finance/配置单元/仓库/fdm_sor.db/t_fin_demo/staits_date=201900/000002_03。程序运行时间TotalMapReduceCPUTimeSpent:54seconds200msecTimetaken:Summaryfromabove36.445seconds从数据可以看出,在未压缩模式下,数据存储的格式是文本格式,没有后缀,可以直接从-cat查看。文件存储大小为原文件大小271+271+4.7=546.7Mb,运行时间为36.445。2、使用hive默认的压缩方式。hive中存放的文件后缀为.deflate1。使用deflate压缩sethive.exec.compress.output=true;--true是开启压缩,默认关闭。启用压缩方式后如果不指定,默认使用defalte。设置mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec;插入覆盖表t_fin_demo分区(staits_date='201904')选择名称,id_type,idcard,org,loan_no,busi_type,busi_category,open_date,due_date,loan_amount,happen_time,amout,due_amt,statfromt_fin_demowherestaits_date='201901';2、查看数据存储和计算[finance@master2-devhadoop]$hadoopfs-du-h/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=20190375.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000000_0.deflate75.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000001_0.deflate1.3M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201903/000002_0.deflate3.程序耗时:Timetaken:54.659seconds总结:以上数据看,使用默认的deflate压缩算法,数据存储文件后缀为.deflate.文件存储的大小为:75.9+75.9+1.3=153.1。程序耗时54.659s。可以看出deflate压缩的压缩率很高,但是程序耗时比不压缩有所增加。3、使用gzip压缩,hive中的文件后缀为.gz1。使用Gzip压缩存储sethive.exec.compress.output=true;setmapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io。compress.GzipCodec;插入覆盖表t_fin_demo分区(staits_date='201904')选择名称、id_type、idcard、org、loan_no、busi_type、busi_category、open_date、dure_date、loan_amount、happen_time、amout、due_amt、statfromt_fin_demodhere9stait=0'';2。使用du-h命令查看hdfs上的文件存储[finance@master2-devhadoop]$hadoopfs-du-h/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=20190475.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000000_0.gz75.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201904/000001_0.gz1.3M/user/finance/配置单元/仓库/fdm_sor.db/t_fin_demo/staits_date=201904/000002_0.gz3。程序运行时间TotalMapReduceCPUTimeSpent:1分33秒430msecOKTimetaken:62.436secondsSummary:从以上数据来看,使用默认的gzip压缩算法,数据存储文件后缀名为.gz,文件存储大小为:75。9+75.9+1.3=153.1该程序耗时为62.436。如果下载到windows,本地解压,就可以读取了。4.使用lzo压缩算法压缩,文件后缀为.lzo_deflate1。使用lzo压缩存储sethive.exec.compress.output=true;setmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;insertoverwritetablet_fin_demopartition(staits_date='201905')选择名称、id_type、idcard、org、loan_no、busi_type、busi_category、open_date、dure_date、loan_amount、happen_time、amout、due_amt、statfromt_fin_demowherestaits_date='201901';2.使用du-h命令查看hdfs上的文件存储[finance@master2-devhadoop]$hadoopfs-du-h/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905121.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000000_0.lzo_deflate121.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201905/000001_0.lzo_deflate2.1M/用户/财务/配置单元/仓库/fdm_sor.db/t_fin_demo/staits_date=201905/000002_0.lzo_deflate3。程序运行时间TotalMapReduceCPUTimeSpent:58takTime0seconds:OK742.45seconds总结:根据以上资料,使用默认的lzo压缩算法,数据存储文件后缀名为.lzo_deflate。文件存储大小为:121.9+121.9+2.1=245.9程序耗时42.45s。5、使用Lzop压缩方式,hive中存放的文件后缀为.lzo1。使用lzop进行压缩存储sethive.exec.compress.output=true;setmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzopCodec;insertoverwritetablet_fin_demopartition(staits_date='201906')select名称,id_type,idcard,org,loan_no,busi_type,busi_category,open_date,dure_date,loan_amount,happen_time,amout,due_amt,statfromt_fin_demowhereate=0'2';2。使用du-h命令查看hdfs上的文件存储[finance@master2-devhadoop]$hadoopfs-du-h/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906121.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000000_0.lzo121.9M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201906/000001_0.lzo2.1M/user/finance/配置单元/仓库/fdm_sor.db/t_fin_demo/staits_date=201906/000002_0.lzo3。程序运行时间TotalMapReduceCPUTimeSpent:47seconds280msecOKTimetaken:34.439secondsSummary:从以上数据来看,使用默认的Lzop压缩算法,数据存储文件后缀为.lzo。文件存储的大小为:121.9+121.9+2.1=245.9。程序时间为34.439s。6、使用BZip2压缩方式,hive中存放的文件后缀为.bz21。使用Bzip2压缩存储sethive.exec.compress.output=true;setmapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;insertoverwritetablet_fin_demopartition(staits_date='201907')selectname,id_type,idcard,org,loan_no,busi_type,busi_category,open_date,dure_date,loan_amount,happen_time,amout,due_amt,statfromt_fin_demowhere=sta'201901';2.使用du-h命令查看hdfs上的文件存储[finance@master2-devhadoop]$hadoopfs-du-h/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=20190752.5M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000000_0.bz252.5M/user/finance/hive/warehouse/fdm_sor.db/t_fin_demo/staits_date=201907/000001_0.bz2935.2K/用户/财务/配置单元/仓库/fdm_sor.db/t_fin_demo/staits_date=201907/000002_0.bz23。程序运行时间TotalMapReduceCPUTimeSpent:2分47秒530msecOKTimetaken:96.42secondsSummary:看到上面的数据,使用默认的Bzip2压缩算法,数据存储文件后缀为.bz2文件存储大小为:52.5+52.5+0.934=106Mb。程序耗时96.42s各种压缩算法综合分析压缩方式原始文件大小压缩文件运行时间备注不压缩516.4Mb546.70Mb36.445sdefalte(默认压缩)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.42sGZip和BZip2压缩可以保证压缩文件最小,但是太费时,不适合基于CPU的操作。从上表可以看出,每种压缩算法都有自己的优缺点。使用哪种压缩取决于具体的存储数据格式和计算方式。具体的压缩用法和原理可以参考后续博客。1、从压缩率上看:bzip2>gzip>deflate>lzo,所以bzip2最节省存储空间,但耗费时间。2、解压速度和耗时:lzo>deflate>gzip>bzip2本文转载自微信公众号“地生大数据”,作者“地生大数据”,可通过以下二维码关注。转载本文请联系“地生大数据”公众号。
