roman_日积跬步-终至千里

roman_日积跬步-终至千里

一.hive的行式存储与列式存储

HIve的文件存储格式常见的有四种:textfile 、sequencefile、orc、parquet ,前面两种是行式存储,后面两种是列式存储。

 
如下图,箭头的方向代表了数据是如何进行(写入)组织排列的。

【004hive基础】hive的文件存储格式与压缩-LMLPHP
 

我们讨论一下行、列存储在读写上的特点:

行存储在数据写入和修改上的优势
写入:

修改:

因为行式存储写入和修改都是一次完成,相比列式存储需要将一行记录进行拆分,行式存储的优势还是比较明显的。
 
 
列式存储在数据读取和解析、分析数据上具有优势
数据读取方面:

数据解析方面:

 
所以列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域比较重要。

 
 

二. 存储格式

1. TEXTFILE

hive默认存储格式,数据不做压缩,磁盘开销大,数据解析开销大。

 

2. ORC格式

Orc (Optimized Row Columnar)是hive 0.11版里引入的新的存储格式。

可以看到每个Orc文件由1个或多个stripe组成,每个stripe250MB大小,这个Stripe实际相当于RowGroup概念,不过大小由4MB->250MB,这样能提升顺序读的吞吐率。

【004hive基础】hive的文件存储格式与压缩-LMLPHP
每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer:

 
数据读取逻辑:

 

3. PARQUET格式 ing

Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。

Parquet文件的格式如下图所示:

 
 

三. Hive压缩格式

在实际工作当中,hive当中处理的数据,一般都需要经过压缩,使用压缩来节省我们的MR处理的网络带宽。

1. mr支持的压缩格式:

【004hive基础】hive的文件存储格式与压缩-LMLPHP
 
hadoop支持的解压缩的类:
【004hive基础】hive的文件存储格式与压缩-LMLPHP

 
压缩性能的比较:
【004hive基础】hive的文件存储格式与压缩-LMLPHP

 
hadoop需要配置的压缩参数:

【004hive基础】hive的文件存储格式与压缩-LMLPHP

 

2. hive配置压缩的方式:

2.1. 开启map端的压缩方式:

1.1)开启hive中间传输数据压缩功能
 hive (default)>set hive.exec.compress.intermediate=true;
1.2)开启mapreduce中map输出压缩功能
 hive (default)>set mapreduce.map.output.compress=true;
1.3)设置mapreduce中map输出数据的压缩方式
 hive (default)>set mapreduce.map.output.compress.codec
                  = org.apache.hadoop.io.compress.SnappyCodec;
1.4)执行查询语句
 select count(1) from score;

2.2.开启reduce端的压缩方式:

1)开启hive最终输出数据压缩功能
 hive (default)>set hive.exec.compress.output=true;
2)开启mapreduce最终输出数据压缩
 hive (default)>set mapreduce.output.fileoutputformat.compress=true;
3)设置mapreduce最终数据输出压缩方式
 hive (default)> set mapreduce.output.fileoutputformat.compress.codec 
                       = org.apache.hadoop.io.compress.SnappyCodec;
4)设置mapreduce最终数据输出压缩为块压缩
 hive (default)>set mapreduce.output.fileoutputformat.compress.type
                       =BLOCK;
5)测试一下输出结果是否是压缩文件
 insert overwrite local directory '/export/servers/snappy' 
       select * from score distribute by s_id sort by s_id desc;

 
 

四. hive中存储格式和压缩相结合

以ORC举例,相关配置参数:
【004hive基础】hive的文件存储格式与压缩-LMLPHP

创建一个非压缩的ORC存储方式:

1)建表语句
    create table log_orc_none(
    track_time string,
    url string,
    session_id string
    )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    STORED AS orc tblproperties ("orc.compress"="NONE");
2)插入数据
 insert into table log_orc_none select * from log_text ;
3)查看插入后数据
 dfs -du -h /user/hive/warehouse/myhive.db/log_orc_none;
 结果显示:
 7.7 M  /user/hive/warehouse/log_orc_none/123456_0

创建一个SNAPPY压缩的ORC存储方式:

1)建表语句
    create table log_orc_snappy(
    track_time string,
    url string,
    session_id string
    )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    STORED AS orc tblproperties ("orc.compress"="SNAPPY");
2)插入数据
 insert into table log_orc_snappy select * from log_text ;
3)查看插入后数据
 dfs -du -h /user/hive/warehouse/myhive.db/log_orc_snappy ;
 结果显示: 
 3.8 M  /user/hive/warehouse/log_orc_snappy/123456_0
 
4)实际上:默认orc存储文件默认采用ZLIB压缩。比snappy压缩率还高。

存储方式和压缩总结:

在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。 压缩方式一般选择snappy。

 
 

五. hive主流存储格式性能对比

从存储文件的压缩比和查询速度两个角度对比

1. 压缩比比较

1)创建表,存储数据格式为TEXTFILE、ORC、Parquet
    create table log_text (
    track_time string,
    url string,
    session_id string,
    )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
    STORED AS TEXTFILE  ;2)向表中加载数据
 load data local inpath '/export/servers/hivedatas/log.data' into table log_text ;3)查看表中数据大小,大小为18.1M
 dfs -du -h /user/hive/warehouse/myhive.db/log_text;

...
textfile:结果显示: 
 18.1 M  /user/hive/warehouse/log_text/log.data


ORC 结果显示:
 2.8 M  /user/hive/warehouse/log_orc/123456_0

Parquet结果显示:
13.1 M  /user/hive/warehouse/log_parquet/123456_0

 

2. 存储文件的查询效率测试

1)textfile
hive (default)> select count(*) from log_text;
_c0
100000
Time taken: 21.54 seconds, Fetched: 1 row(s)  

2)orc
hive (default)> select count(*) from log_orc;
_c0
100000
Time taken: 20.867 seconds, Fetched: 1 row(s) 


3)parquet
hive (default)> select count(*) from log_parquet; 
_c0
100000
Time taken: 22.922 seconds, Fetched: 1 row(s)

 
 

参考:
https://cloud.tencent.com/developer/article/1880494

05-22 09:46