Hadoop文件存储格式及Hive数据压缩

 一、文件的存储格式

1.TEXTFILE

创建表时的默认文件格式,数据被存储成文本格式。文本文件可以被分割和并行处理,也可以使用压缩,比如GZip、LZO或者Snappy。然而大部分的压缩文件不支持分割和并行处理,会造成一个作业只有一个mapper去处理数据,使用压缩的文本文件要确保文件不要过大,一般接近两个HDFS块的大小。

2. SEQUENCEFILE

keyvalue对的二进制存储格式,sequence文件的优势是比文本格式更好压缩,sequence文件可以被压缩成块级别的记录,块级别的压缩是一个很好的压缩比例。如果使用块压缩,需要使用下面的配置:

set hive.exec.compress.output=true;
set io.seqfile.compression.type=BLOCK

支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。

3.AVRO

二进制格式文件,除此之外,avro也是一个序列化和反序列化的框架。avro提供了具体的数据schema。

4.RCFILE

全称是Record Columnar File,首先将表分为几个行组,对每个行组内的数据进行按列存储,每一列的数据都是分开存储,即先水平划分,再垂直划分。

5.ORC

全称是Optimized Row Columnar,从hive0.11版本开始支持,ORC格式是RCFILE格式的一种优化的格式,提供了更大的默认块(256M)

支持三种压缩选择:NONE,ZLIB,SNAPPY。

ORC默认的压缩方式比SNAPPY压缩得到的文件还小,原因是ORZ默认的ZLIB压缩方式采用的是deflate压缩算法,比Snappy压缩算法得到的压缩比高,压缩的文件更小。

ORC不同压缩方式之间的执行速度,经过多次测试发现三种压缩方式的执行速度差不多,所以建议采用ORC默认的存储方式进行存储数据。

6.PARQUET

另外一种列式存储的文件格式,与ORC非常类似,与ORC相比,Parquet格式支持的生态更广,比如低版本的impala不支持ORC格式。 支持snappy、lzo压缩等

Hive建表示例:

1、ORC格式存储,Snappy压缩
create table stu_orc(id int,name string)
stored as orc 
tblproperties ('orc.compress'='snappy');

2.单纯snappy压缩(直接建表文本处理就行)
create table stu_orc(id int,name string);

2、Parquet格式存储,Lzo压缩
create table stu_par(id int,name string)
stored as parquet 
tblproperties ('parquet.compression'='lzo');

3、Parquet格式存储,Snappy压缩
create table stu_par(id int,name string)
stored as parquet 
tblproperties ('parquet.compression'='snappy');
 
4.lzo压缩(需要单独指定InputFormat)
CREATE EXTERNAL TABLE `stu_par`(
  `event` string)
PARTITIONED BY ( 
  `ds` string, 
  `hs` string) 
    stored as
        INPUTFORMAT'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
        OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://mycluster/user/pirate/flume/log/Test' ;

参考:

https://segmentfault.com/a/1190000023764779

 Hive文件与记录格式

 

二、Hadoop支持的压缩格式对比和应用场景

对于文件的存储、传输、磁盘IO读取等操作在使用Hadoop生态圈的存储系统时是非常常见的,而文件的大小等直接影响了这些操作的速度以及对磁盘空间的消耗。

此时,一种常用的方式就是对文件进行压缩。但文件被压缩之后,在读取数据时要先进行解压缩,会对CPU造成一定负担。

因此,在实际生产中,是否对数据进行压缩以及采用哪种方式进行压缩显得尤为重要。需要综合考虑压缩和解压缩数据所需的资源、磁盘IO,以及在网络传输数据所需带宽以及集群的性能和文件的特性等。

开启压缩的好处:

1、减少磁盘存储空间
2、降低IO(包括磁盘和网络IO),加快数据在磁盘和网络中的传输速度,提升性能

首先来看一下常见的Hadoop压缩格式一览表,以及详细介绍:

snappy压缩:

优点:高速压缩速度和合理的压缩率;支持Hadoop native库。

缺点:不支持split;压缩率比gzip要低;Hadoop2.x版本应该自带;

应用场景:当MapReduce作业的map输出的数据量比较大的时候,作为map到reduce的中间数据的压缩格式;或者作为一个MapReduce作业的输出和另外一个MapReduce作业的输入。

lzo压缩:

优点:压缩/解压速度也比较快,合理的压缩率;支持split,是Hadoop中最流行的压缩格式;支持Hadoop native库;可以在linux系统下安装lzop命令,使用方便。

缺点:压缩率比gzip要低一些;hadoop本身不支持,需要安装;在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式)。

应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大,lzo优点越明显。

gzip压缩:

优点:压缩率比较高,而且压缩/解压速度也比较快;Hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有Hadoop native库;大部分linux系统都自带gzip命令,使用方便。

缺点:不支持split

应用场景:当每个文件压缩之后在130M以内的,都可以考虑用gzip压缩格式。比如每天的日志压缩成一个gzip文件,运行MapReduce程序的时候通过多个gzip文件达到并发。

对于处理这些文件的程序(如Hive、流、MapReduce程序)完全和文本处理一样,压缩之后原来的程序不需要做任何修改。

bzip2压缩优点:

支持split;具有很高的压缩率,比gzip压缩率都高;Hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便。

缺点:压缩/解压速度慢;不支持native。

应用场景:适合对速度要求不高,但需要较高的压缩率的场景。可以作为MapReduce作业的输出格式;输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;

对单个很大的文本文件想压缩减少存储空间,同时又需要支持split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。

ps:在介绍上述压缩格式时,强调了它们是否对Hadoop native库的支持,因为是否支持Hadoop native库对性能产生巨大影响。

Hadoop是使用Java语言开发的,但是有些操作并不总适合使用Java,所以才引入了native库即本地库的概念。通过使用本地库,Hadoop可更加高效的执行某些操作。

参考:

Hive文件存储格式和hive数据压缩

https://blog.csdn.net/Ctt8912/article/details/81160604

Hadoop支持Lzo压缩配置及案例

原文地址:https://www.cnblogs.com/-courage/p/15129797.html