hive之生产常用的文件存储格式

1.生产常用的文件格式

查询hive的官网可知,hive的文件格式有如下

SEQUENCEFILE:生产中绝对不会用,k-v格式,比源文本格式占用磁盘更多

TEXTFILE:生产中用的多,行式存储

RCFILE:生产中用的少,行列混合存储,OCR是他得升级版

ORC:生产中最常用,列式存储

PARQUET:生产中最常用,列式存储

AVRO:生产中几乎不用,不用考虑

JSONFILE:生产中几乎不用,不用考虑

INPUTFORMAT:生产中几乎不用,不用考虑

hive默认的文件格式是TextFile,可通过set hive.default.fileformat 进行配置

2.行式与列式存储对比

大数据99%以上的场景都是使用的是列式存储数据
2.1行式与列式存储数据物理底层存储区别

1)行式存储textfile

​ 所有的内容都放在一个 BLOCK 中

①优点:当select * 的时候,会直接将所有内容全部查出来

②缺点:当select a,c from xx 的时候,它还是将所有内容都查一遍,然后显示a,c列。

2)列式存储:orc parquet

​ 按照列的方式 存储在几个 BLOCK 中

①优点:当select a,c from xx 的时候,它只需要查询 a,c所在的块,不需要多余的io。

②缺点:当select * 的时候,数据会发生 重组。

3.在hive上压缩文件:

1
2
3
创建一个表格并将数据加载到表格中:

create table g6_access_copy as select * from g6_access;

进入 hive官网

设置压缩

1
2
3
4
5
6
7
8
hive (d6_hive)> SET hive.exec.compress.output=true;   设置打开压缩
hive (d6_hive)> set mapreduce.output.fileoutputformat.compress.codec
> ;
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec

默认压缩格式是:Bzip2,也可以设置成自己想要的

之后再加载数据 都会变成压缩的形式

4.创建表的时候指定压缩格式:

进入到 DDL中 可以查看 压缩格式:

1
2
3
4
5
6
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)

怎么用呢:

1
2
3
4
[ROW FORMAT row_format] 
[STORED AS file_format]

先写 ROW FORMAT 再写 STORED AS

TEXTFILE:是默认的存储格式,文本格式。

生产上用的最多的(列式):ORC和PARQUET

(注:导入数据的时候不能将文本中的数据导入到其它格式中,需要借助中间表)

原文件大小:

1
2
3
[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hadoop fs -du -s -h /user/hive/warehouse/d6_hive.db/g6_access_copy

7.5 M 7.5 M /user/hive/warehouse/d6_hive.db/g6_access_copy
SEQUENCEFILE:序列化 <key,value> 采用这种方式存储以后文件会变大,生产中不用



RCFILE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
hive (d6_hive)> create table g6_access_copy_RC (
> cdn string,
> region string,
> level string,
> time string,
> ip string,
> domain string,
> url string,
> traffic bigint,
> day string
> )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS RCFILE;

创建一个表格

借助中间报表导入数据:

INSERT OVERWRITE TABLE g6_access_copy_RC SELECT * from g6_access_copy;

查看文件大小:
[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hadoop fs -du -s -h /user/hive/warehouse/d6_hive.db/g6_access_copy_rc

7.1 M 7.1 M /user/hive/warehouse/d6_hive.db/g6_access_copy_rc


ORC:默认采用了压缩

Index Data 中 存储了id以及其它,当查询的时候,读数据之前先会去读索引,通过查询id,可以知道查询内容属于哪一部分,只读取那一部分的内容即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
创建一个表格,指定文件形式。

hive (d6_hive)> create table g6_access_copy_ORC (
> cdn string,
> region string,
> level string,
> time string,
> ip string,
> domain string,
> url string,
> traffic bigint,
> day string
> )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS ORC;

通过中间表加载数据:

hive (d6_hive)> INSERT OVERWRITE TABLE g6_access_copy_ORC SELECT * from g6_access_copy;

查看文件大小:

[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hadoop fs -du -s -h /user/hive/warehouse/d6_hive.db/g6_access_copy_orc
544.8 K 544.8 K /user/hive/warehouse/d6_hive.db/g6_access_copy_orc

默认使用 ZILB 压缩
也可以设置不采用压缩:
在建表的时候,最后加上:stored as orc tblproperties ("orc.compress"="NONE");
PARQUET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
创建表:  指定文件形式

set parquet.compression=gzip; #设置parquet文件的压缩格式,我这里就不设置,文件大小都一致

hive (d6_hive)> create table g6_access_copy_PA (
> cdn string,
> region string,
> level string,
> time string,
> ip string,
> domain string,
> url string,
> traffic bigint,
> day string
> )ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS PARQUET;

通过中间表加载数据:

hive (d6_hive)> INSERT OVERWRITE TABLE g6_access_copy_PA SELECT * from g6_access_copy;

查看文件大小:

[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hadoop fs -du -s -h /user/hive/warehouse/d6_hive.db/g6_access_copy_pa
1.3 M 1.3 M /user/hive/warehouse/d6_hive.db/g6_access_copy_pa

刚才是存储,那么接下来我们看一下查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
首先 我们查询一下表g6_access_copy:

hive (d6_hive)> select count(*) from g6_access_copy where domain="v3.go2yd.com";

显示结果信息:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 3.74 sec HDFS Read: 7866238 HDFS Write: 6 SUCCESS

HDFS Read:7866238M 读了7.8M 也就是说我们读的是一个普通的表,也就是全表扫描


我们再查一下表: g6_access_copy_rc:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 3.3 sec HDFS Read: 668319 HDFS Write: 6 SUCCESS

HDFS Read:668319M


我们再查一下表:g6_access_copy_orc
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 3.14 sec HDFS Read: 41340 HDFS Write: 6 SUCCESS

HDFS Read:41340M


我们再查一下表:g6_access_copy_parquet:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 3.38 sec HDFS Read: 22535 HDFS Write: 6 SUCCESS

HDFS Read: 22535M

由此可以看出 orc 和 parquet 查询时所读取的数据量是比较少的,所以性能也比较好。

以后测性能的时候需要从两个角度考虑,一个是存储,一个是查询。

总结:

​ 相同数据量的数据,列式存储(ORC、PARQUET)占的磁盘空间远远低于行式存储(如textfile),当查询部分字段是,列式存储的数据只需加载对应的列数据即可。
存少读少,极大磁盘使用以及IO,相对减少资源(内存,cpu)不必要的浪费,故列式存储在大数据领域完爆行式存储。

本文标题:hive之生产常用的文件存储格式

文章作者:skygzx

发布时间:2019年04月17日 - 07:41

最后更新:2019年04月22日 - 13:43

原始链接:http://yoursite.com/2019/04/17/hive之生产常用的文件存储格式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%