hadoop之生产常用的文件格式

1.生产常用的文件格式

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

  • SEQUENCEFILE:生产中绝对不会用,k-v格式,比源文本格式占用磁盘更多
  • TEXTFILE:生产中用的多,行式存储
  • RCFILE:生产中用的少,行列混合存储,OCR是他得升级版
  • ORC:生产中最常用,列式存储
  • PARQUET:生产中最常用,列式存储
  • AVRO:生产中几乎不用,不用考虑
  • JSONFILE:生产中几乎不用,不用考虑
  • INPUTFORMAT:生产中几乎不用,不用考虑

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

2.行式与列式存储对比

大数据99%以上的场景都是使用的是列式存储数据

2.1行式与列式存储数据物理底层存储区别

2
如上图:
行式存储的一行数据一定是在同一个block块中,任何的select 底层都是全字段查询。
列式存储的一行数据不同列可以在不同的block块中。

2.2优缺点

列式存储:

  • 优点:当查询部分字段时,极大减小列查询数据的范围,显著提高查询效率
  • 缺点:当查询全部字段时,数据需要重组,比直接读取一行慢

行式存储:

  • 优点:全字段查询速度快
  • 缺点:当查询部分字段时,底层依旧读取所有字段数据,造成资源浪费。生产中很少遇到全字段查询

3.hive文件格式配置实现以及对比

page_views表textfile格式大小为18.1M,相关测试数据信息请参考hadoop之文件压缩格式对比分析以及配置压缩格式

#先关闭压缩
SET hive.exec.compress.output=false;
3.1使用SEQUENCEFILE文件格式
#创建SEQUENCEFILE数据存储格式表
create table page_views_seq
stored as SEQUENCEFILE
as select * from page_views;

#查看hdfs数据
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_seq/*
19.6 M  19.6 M  /user/hive/warehouse/wsktest.db/page_views_seq/000000_0

SEQUENCEFILE格式数据反而变大了,生产肯定不可取的

3.2使用RCFILE格式
#创建RCFILE数据存储格式表
create table page_views_rc
stored as RCFILE
as select * from page_views;

#查看hdfs数据
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_rc/*
17.9 M  17.9 M  /user/hive/warehouse/wsktest.db/page_views_rc/000000_0

相较于普通文件,无读写以及存储优势,rc格式数据只节约了10%左右的空间存储,生产测试中读写性能也没有多大的提升,

3.3使用ORC文件格式
#创建ORC文件格式表,默认是使用zlib压缩,支持zlib和snappy
create table page_views_orc
stored as ORC
as select * from page_views;
#查看hdfs数据
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_orc/*
2.8 M  2.8 M  /user/hive/warehouse/wsktest.db/page_views_orc/000000_0

#创建ORC文件格式表,不使用压缩
create table page_views_orc_none
stored as ORC tblproperties ("orc.compress"="NONE")
as select * from page_views;
#查看hdfs数据
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_orc_none/*
7.7 M  7.7 M  /user/hive/warehouse/wsktest.db/page_views_orc_none/000000_0

orc格式文件大小是原文本1/3左右,默认使用压缩则只有原文本的1/6左右,由此可见生产上对orc格式的青睐。

3.4使用PARQUET文件格式
#创建PARQUET文件格式表
set parquet.compression=gzip; #设置parquet文件的压缩格式,我这里设不设置,文件大小都一致
create table page_views_par
stored as PARQUET
as select * from page_views;

#查看hdfs数据
[hadoop@hadoop001 ~]$ hdfs dfs -du -s -h /user/hive/warehouse/wsktest.db/page_views_par/*
3.9 M  3.9 M  /user/hive/warehouse/wsktest.db/page_views_par/000000_0

parquet格式文件大小是源文件的1/5左右。生产上也是好的选择

3.5读取数据量对比
直接执行 select 查询,观察日志 尾部HDFS Read: 190XXX ,就可知道读取数据量了

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

猜你喜欢

转载自blog.csdn.net/qq_32641659/article/details/89339143