hive 压缩全解读(hive表存储格式和外部表支持加载的压缩的格式)
2016-01-20 19:49
666 查看
数据做压缩和解压缩会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,所以
最好对那些I/O密集型的作业使用数据压缩,
cpu密集型,使用压缩反而会降低性能
而hive中间结果是map输出传给reduce,所以应该使用低cpu开销和高压缩效率,一般最好使用snappy。
------------------------------------------------------------------------------
表存储格式是表自身的存储结构,内部涉及存储数据的结构,查询方法,索引构建等等。
而源数据格式是数据自身的存储方式,比如txt格式文件,或者压缩存储的数据zip、lzo、br2等等,跟hive无关,其文件格式要hive支持才能被外部表直接加载。
SEQUENCEFILE(三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩)
RCFILE
ORC
自定义格式
1)SEQUENCEFILE文件格式表,是Hadoop API提供的一种二进制文件支持,使用方便、可分割、可压缩。使用时需要设置参数,再建表
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK; -- NONE/RECORD/BLOCK
create table test2(str STRING)
STORED AS SEQUENCEFILE;
create table lzo(name string)
STORED AS
INPUTFORMAT
'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
SEQUENCEFILE将数据以<key,value>的形式序列化到文件中。序列化和反序列化使用Hadoop
的标准的Writable 接口实现。key为空,用value 存放实际的值, 这样可以避免map 阶段的排序过程。
2)RCFILE是一种row
column相结合的存储,先按列划分,再垂直划分。也就是按row切块(将多行合并为一个块),块内为列存储。
理论上具有高查询效率(但hive官方说效果不明显,只有存储上能省10%的空间)。
RCFile结合行存储查询的快速和列存储节省空间的特点
1)同一行的数据位于同一节点,因此元组重构的开销很低;
2) 块内列存储,可以进行列维度的数据压缩,跳过不必要的列读取。
查询过程中,在IO上跳过不关心的列。实际过程是,在map阶段从远端拷贝仍然拷贝整个数据块到本地目录,也并不是真正直接跳过列,而是通过扫描每一个row group的头部定义来实现的。但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row
group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。
Gzip和Snappy则不支持。
gzip org.apache.hadoop.io.compress.GzipCodec
bzip org.apache.hadoop.io.compress.BZip2Codec
Snappy org.apache.hadoop.io.compress.SnappyCodec
LZO:
org.apache.hadoop.io.compress.LzopCodec或者com.hadoop.compression.lzo.LzopCodec;
org.apache.hadoop.io.compress.LzoCodec或者com.hadoop.compression.lzo.LzoCodec;
注意:(引自http://ju.outofmemory.cn/entry/63512)
(1)org.apache.hadoop.io.compress.LzoCodec和com.hadoop.compression.lzo.LzoCodec功能一样,都是源码包中带的,返回都是lzo_deflate文件
(2)有两种压缩编码可用,即LzoCodec和LzopCodec,区别是:
1)LzoCodec比LzopCodec更快, LzopCodec为了兼容LZOP程序添加了如 bytes signature, header等信息
2)LzoCodec作为Reduce输出,结果文件扩展名为”.lzo_deflate”,无法被lzop读取;
而使用LzopCodec作为Reduce输出,生成扩展名为”.lzo”的文件,可被lzop读取
3)LzoCodec结果(.lzo_deflate文件)不能由lzo index job的"DistributedLzoIndexer"创建index;且“.lzo_deflate”文件不能作为MapReduce输入(不识别,除非自编inputformat)。而所有这些“.LZO”文件都支持
综上所述,应该map输出的中间结果使用 LzoCodec,reduce输出用 LzopCodec
===============================================================================
也就是说,参数io.compression.codecs是hadoop的MR读写支持的所有格式支持,如果设置,就必须设置所有支持格式。默认支持,没有必要的话,最好别加。设置多个语法为:
set io.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec;
当然,
set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
和
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec
两者一样,是LzopCodec的两个不同开源包。用哪个都行。
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.Hadoop.io.compress.LzoCodec;
map结果压缩最好使用snappy的,因为压缩的前提是map输出非常大,影响io,如果中间结果数据集比较小反而会拖慢速度
另外,中间结果的压缩格式设置还可以直接设置map输出结果压缩实现,如
set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec
来代替set hive.intermediate.compression.codec这个语句实现
选择编解码器(压缩格式)参数 mapred.output.compression.code(
命令格式
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
(也可以用org.apache.hadoop.io.compress.SnappyCodec)
或者
set mapred.output.compress=true
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec
两种方式功能一样,之所以两个方式,是因为作用不同的参数文件
hive.exec.compress.output和mapred.output.compression.codec是hive-site.xml中的配置参数
而mapred.output.compress
和mapred.output.compression.codec 是hdfs-site.xml的配置参数
都可以配置实现。可以查看各个文件中的配置参数,如
[b]hive-site.xml中有[/b]
<!--
<property>
<name>hive.exec.compress.output</name>
<value>true</value>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.GzipCodec</value>
</property>
-->
mapred-site.xml中有
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
core-site.xml中有
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzopCodec</value>
</property>
hadoop-site.xml中有
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec</value>
<description>A list of the compression codec classes that can be used
for compression/decompression.</description>
</property>
<property>
<name>mapred.output.compress</name>
<value>true</value>
<description>Should the job outputs be compressed?
</description>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.LzoCodec</value>
<description>If the job outputs are compressed, how should they be compressed?
</description>
</property>
如果不建立lzo索引则不会按照block来切分块
为每个lzo块添加index的命令:
hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.15.jar com.hadoop.compression.lzo.DistributedLzoIndexer path/xxx.lzo
注意(只设置mapred.output.compress=true默认的reduce输出格式为.lzo_deflate)
最好对那些I/O密集型的作业使用数据压缩,
cpu密集型,使用压缩反而会降低性能
而hive中间结果是map输出传给reduce,所以应该使用低cpu开销和高压缩效率,一般最好使用snappy。
------------------------------------------------------------------------------
hive中表存储格式和源数据格式
hive中表存储格式和源数据格式含义不同。比如hive的TEXTFILE外部表可加载很多格式的源数据,但不支持的格式则必须自己重写INPUTFORMAT和OUTPUTFORMAT文件类。表存储格式是表自身的存储结构,内部涉及存储数据的结构,查询方法,索引构建等等。
而源数据格式是数据自身的存储方式,比如txt格式文件,或者压缩存储的数据zip、lzo、br2等等,跟hive无关,其文件格式要hive支持才能被外部表直接加载。
hive表的存储格式有
TEXTFILESEQUENCEFILE(三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩)
RCFILE
ORC
自定义格式
1)SEQUENCEFILE文件格式表,是Hadoop API提供的一种二进制文件支持,使用方便、可分割、可压缩。使用时需要设置参数,再建表
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK; -- NONE/RECORD/BLOCK
create table test2(str STRING)
STORED AS SEQUENCEFILE;
create table lzo(name string)
STORED AS
INPUTFORMAT
'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
SEQUENCEFILE将数据以<key,value>的形式序列化到文件中。序列化和反序列化使用Hadoop
的标准的Writable 接口实现。key为空,用value 存放实际的值, 这样可以避免map 阶段的排序过程。
2)RCFILE是一种row
column相结合的存储,先按列划分,再垂直划分。也就是按row切块(将多行合并为一个块),块内为列存储。
理论上具有高查询效率(但hive官方说效果不明显,只有存储上能省10%的空间)。
RCFile结合行存储查询的快速和列存储节省空间的特点
1)同一行的数据位于同一节点,因此元组重构的开销很低;
2) 块内列存储,可以进行列维度的数据压缩,跳过不必要的列读取。
查询过程中,在IO上跳过不关心的列。实际过程是,在map阶段从远端拷贝仍然拷贝整个数据块到本地目录,也并不是真正直接跳过列,而是通过扫描每一个row group的头部定义来实现的。但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row
group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。
源数据在云上(hdfs)压缩存储
Hadoop默认支持Gzip和BZip2的解压缩方式,可直接读取(text命令),但hive表只能通过STORED AS TEXTFILE格式的表加载,然后再insert overwrite其他格式的表(比如SEQUENCEFILE表),如果hive其他格式的表想要直接加载压缩格式数据,需要重写INPUTFORMAT和OUTPUTFORMAT文件类压缩格式文件的切分(不支持则hadoop不能并行的进行map操作)
BZip2和LZO(提供block级的压缩)支持文件切分Gzip和Snappy则不支持。
hadoop中常见的压缩格式
DEFLATE org.apache.hadoop.io.compress.DefaultCodecgzip org.apache.hadoop.io.compress.GzipCodec
bzip org.apache.hadoop.io.compress.BZip2Codec
Snappy org.apache.hadoop.io.compress.SnappyCodec
LZO:
org.apache.hadoop.io.compress.LzopCodec或者com.hadoop.compression.lzo.LzopCodec;
org.apache.hadoop.io.compress.LzoCodec或者com.hadoop.compression.lzo.LzoCodec;
注意:(引自http://ju.outofmemory.cn/entry/63512)
(1)org.apache.hadoop.io.compress.LzoCodec和com.hadoop.compression.lzo.LzoCodec功能一样,都是源码包中带的,返回都是lzo_deflate文件
(2)有两种压缩编码可用,即LzoCodec和LzopCodec,区别是:
1)LzoCodec比LzopCodec更快, LzopCodec为了兼容LZOP程序添加了如 bytes signature, header等信息
2)LzoCodec作为Reduce输出,结果文件扩展名为”.lzo_deflate”,无法被lzop读取;
而使用LzopCodec作为Reduce输出,生成扩展名为”.lzo”的文件,可被lzop读取
3)LzoCodec结果(.lzo_deflate文件)不能由lzo index job的"DistributedLzoIndexer"创建index;且“.lzo_deflate”文件不能作为MapReduce输入(不识别,除非自编inputformat)。而所有这些“.LZO”文件都支持
综上所述,应该map输出的中间结果使用 LzoCodec,reduce输出用 LzopCodec
===============================================================================
hive压缩的编解码器(压缩格式)
执行 set io.compression.codecs 可以查看目前hive已加载的所以编解码器(逗号分隔)也就是说,参数io.compression.codecs是hadoop的MR读写支持的所有格式支持,如果设置,就必须设置所有支持格式。默认支持,没有必要的话,最好别加。设置多个语法为:
set io.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec;
当然,
set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
和
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec
两者一样,是LzopCodec的两个不同开源包。用哪个都行。
hive压缩设置
1)中间结果压缩
中间结果是map产生的。格式设置语句set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.Hadoop.io.compress.LzoCodec;
map结果压缩最好使用snappy的,因为压缩的前提是map输出非常大,影响io,如果中间结果数据集比较小反而会拖慢速度
另外,中间结果的压缩格式设置还可以直接设置map输出结果压缩实现,如
set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec
来代替set hive.intermediate.compression.codec这个语句实现
2)最终输出结果压缩
配置参数为 hive.exec.compress.output选择编解码器(压缩格式)参数 mapred.output.compression.code(
命令格式
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
(也可以用org.apache.hadoop.io.compress.SnappyCodec)
或者
set mapred.output.compress=true
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec
两种方式功能一样,之所以两个方式,是因为作用不同的参数文件
hive.exec.compress.output和mapred.output.compression.codec是hive-site.xml中的配置参数
而mapred.output.compress
和mapred.output.compression.codec 是hdfs-site.xml的配置参数
都可以配置实现。可以查看各个文件中的配置参数,如
[b]hive-site.xml中有[/b]
<!--
<property>
<name>hive.exec.compress.output</name>
<value>true</value>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.GzipCodec</value>
</property>
-->
mapred-site.xml中有
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<name>mapred.map.output.compression.codec</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
core-site.xml中有
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzopCodec</value>
</property>
hadoop-site.xml中有
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec</value>
<description>A list of the compression codec classes that can be used
for compression/decompression.</description>
</property>
<property>
<name>mapred.output.compress</name>
<value>true</value>
<description>Should the job outputs be compressed?
</description>
</property>
<property>
<name>mapred.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.LzoCodec</value>
<description>If the job outputs are compressed, how should they be compressed?
</description>
</property>
设置的另外方式:
hive –hiveconf hive.exec.compress.output=true –hiveconf mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec重要的辅助工作,添加索引
添加index是为让.lzo文件子在hdfs上按照block大小来切分块(速度加快,但多消耗cpu时间。map数大量增加)如果不建立lzo索引则不会按照block来切分块
为每个lzo块添加index的命令:
hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.15.jar com.hadoop.compression.lzo.DistributedLzoIndexer path/xxx.lzo
注意(只设置mapred.output.compress=true默认的reduce输出格式为.lzo_deflate)
相关文章推荐
- Ubuntu 安装Chrome 浏览器
- 2016-01-20 FFC
- Java4Android之BlockingQueue
- 11111
- 2016年,编程计划
- 自定义tcp流媒体传输协议延时在300ms以内
- jQuery核心
- web界面拨打电话
- 【HDOJ】3386 Final Kichiku “Lanlanshu”
- leetcode--Plus one
- poj 2251 Dungeon Master(bfs)
- Eclipse中Android项目R.java文件不会自动生成的一种情况的解决方式
- cookie的path和domain參数实例解析
- ALTER SEQUENCE 修改序列解决唯一约束冲突 unique constraint violated
- 初识ARM cotex—A9
- inux运维实战练习-2016年1月19日-2月3日课程作业
- android 比较靠谱的图片压缩
- Git使用教程
- 折线分割平面
- EF上下文对象创建之线程内唯一