格式"/>
Hadoop之存储格式
Hive中不同存储格式的使用
Hive Wiki 中 +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中
通过设置参数:
- 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 |
连接:/
更多推荐
Hadoop之存储格式
发布评论