Hadoop之存储格式

Hive中不同存储格式的使用

Hive Wiki 中 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
在定义SQL语句之后,可以通过 [STORED AS file_format] 进行制定存储格式

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)
  | AVRO        -- (Note: Available in Hive 0.14.0 and later)
  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

从上面的存储格式的产生时间可以看出,后面的存储格式是优于一开始出现的存储格式的,当然也可以用 INPUTFORMAT 来指定自定义的存储格式


行式存储 VS 列式存储

对于行式存储来说,将每一行的数据存储在一起,每一行的数据可能数据类型不相同,压缩起来也会倒是压缩比不高,占用HDFS 上面的空间也会相对多一些,如果使用SQL语句进行查询的时候,select cloumna,columnb from table whre id = xxx ,使用行式存储会导致进行全变扫描,效率必然不高

对于列式存储来说,每一列的数据存储在一起,当查询某几列数据的时候,不用进行全表扫描,只需要查询出对应的几列数据就可以,但是当全表扫描的时候,效率会很低


配置压缩

Hive默认的存储格式是TextFile,对于每种存储格式的性能衡量主要从以下两个方面:

  • 存储(数据量)
  • 计算(时间、读取数据量)

HiveWiki中 https://cwiki.apache.org/confluence/display/Hive/FileFormats相关介绍

通过设置参数:

  • SET hive.exec.compress.output=true;
  • SET mapreduce.output.fileoutputformat.compress=true
  • SET mapreduce.output.fileoutputformat.compress.codec=XXCodec

配置压缩:

在hadoop 的core-site.xml 中配置压缩参数

<property>
	<name>io.compression.codecs</name>
	<value>org.apache.hadoop.io.compress.GzipCodec,
		   org.apache.hadoop.io.compress.DefaultCodec,
		   org.apache.hadoop.io.compress.BZip2Codec,
		   com.hadoop.compression.lzo.LzoCodec
	</value>
</property>

<property>
	<name>io.compression.codec.lzo.class</name>
	<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>

TextFile

纯文本形式的文件大小为18.1M,设置参数和Bzip2Codec后为3.6M

SequenceFile

不建议用SequenceFile
SequenceFile以Key-Value的方式进行组织数据,类似于二进制格式,SequenceFile比TextFile多了一些头信息还有其他一些信息,在占用空间上是要大于TextFile的,对于SequenceFile 通过load的方式是不能够加载数据到表中的,需要通过insert into tble as select 的方式来加载数据到表中,相对于同一份数据的TexeFile(18.1M)Sequence占用的空间是(19.6M)

以上的TextFile和SequenceFile是行式存储接下来介绍列式存储


存储角度对比文件格式

RCFile

RCFile是facebook开源的一个项目,是面向列式存储的,把一列的数据放到一起,同样的RCFile加载数据的时候也是需要用insert into tble as select 的方式。

存储层面上相对于TextFile的18.1M的大小,RCFile占用的空间是17.9M,节省大约10% 左右的空间

ORC File

ORC 的意思是优化后的列式存储,更加快速,占用空间更小,支持多种的数据类型,并且内置索引,比如 select name, age from student where id > 11,id 1到10 存储在一起,11 到20存储在一起,那么这里会直接到11到20的区域里面找数据

ORC File的存储形式是:

  • Index Data 用户存放索引数据
  • Row Data 用于存放真实的数据
  • Footer Data 存放其他的内容

相对于TextFile的18.1M ORC 所占用的空间是7.7M ,如果配置上zlib压缩,那么这里占用空间是2.8M

Parquet

Parquet 支持多种语言、多种协议,室友Twitter和cloudera公司联合开源的一款产品,在Hive 0.13 之后直接使用Sore AS Parquet 来指定存储为Parquet格式,相对于TextFile的18.1M的数据,Parquet所占用的空间是13.1M 如果加上gzip压缩,那么这里占用的空间是3.9M


计算角度对比各种格式

测试的话主要是用select count(*) from table where id=xxx

使用du -s 查看hdfs上面的数据量,在对比相同情况下使用SQL语句拉取的数据量

官方测试:

TextFile RCFile Parquet ORCFile
585G 505G 221G 131G

连接:https://blog.cloudera.com/orcfile-in-hdp-2-better-compression-better-performance/

猜你喜欢

转载自blog.csdn.net/qq_43081842/article/details/105209321