几种hdfs文件存储格式的区别
Text:原始存储,
RCFile:结合列存储和行存储的优缺点,Facebook于是提出了基于行列混合存储的RCFile,它是基于SEQUENCEFILE实现的列存储格式,它即满足快速数据加载和动态负载高适应的需求外,也解决了SEQUENCEFILE的一些瓶颈。该存储结构遵循的是“先水平划分,再垂直划分”的设计理念。先将数据按行水平划分为行组,这样一行的数据就可以保证存储在同一个集群节点;然后在对行进行垂直划分。
ORC:ORC File,它的全名是Optimized Row Columnar (ORC) file,其实就是对RCFile做了一些优化。据官方文档介绍,这种文件格式可以提供一种高效的方法来存储Hive数据。它的设计目标是来克服Hive其他格式的缺陷。运用ORC File可以提高Hive的读、写以及处理数据的性能。ORC File包含一组组的行数据,称为stripes,除此之外,ORC File的file footer还包含一些额外的辅助信息。在ORC File文件的最后,有一个被称为postscript的区,它主要是用来存储压缩参数及压缩页脚的大小。
ORCFile的主要优点为: (1)、每个task只输出单个文件,这样可以减少NameNode的负载; (2)、支持各种复杂的数据类型,比如:datetime, decimal, 以及一些复杂类型(struct、list、 map和 union); (3)、在文件中存储了一些轻量级的索引数据; (4)、基于数据类型的块模式压缩: Integer类型的列用行程长度编码(run-length encoding) String类型的列用字典编码(dictionary encoding) (5)、用多个互相独立的RecordReaders并行读相同的文件; (6)、无需扫描markers就可以分割文件; (7)、绑定读写所需要的内存; (8)、metadata的存储是用 Protocol Buffers的,所以它支持添加和删除一些列。 |
avro:它可以提供:
1 丰富的数据结构类型
2 快速可压缩的二进制数据形式
3 存储持久数据的文件容器
4 远程过程调用RPC
5 简单的动态语言结合功能,Avro和动态语言结合后,读写数据文件和使用RPC协议都不需要生成代码,而代码生成作为一种可选的优化只值得在静态类型语言中实现。
Avro依赖于模式(Schema)。Avro数据的读写操作是很频繁的,而这些操作都需要使用模式,这样就减少写入每个数据资料的开销,使得序列化快速而又轻巧。这种数据及其模式的自我描述方便于动态脚本语言的使用。
Parquet:Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发。一个Parquet文件是由一个header以及一个或多个block块组成,以一个footer结尾。header中只包含一个4个字节的数字PAR1用来识别整个Parquet文件格式。文件中所有的metadata都存在于footer中。footer中的metadata包含了格式的版本信息,schema信息、key-value paris以及所有block中的metadata信息。footer中最后两个字段为一个以4个字节长度的footer的metadata,以及同header中包含的一样的PAR1。
之前新统计系统的日志都是用Avro做序列化和存储,鉴于Parquet的优势和对Avro的兼容,将HDFS上的存储格式改为Paruqet,并且只需做很小的改动就用原读取Avro的API读取Parquet,单列查询效率可以提高近一个数量级。
在互联网大数据应用场景下,通常数据量很大且字段很多,
但每次查询数据只针对其中的少数几个字段,这时候列式存储是极佳的选择。列式存储,天然擅长分析,千万级别的表,count,sum,group by ,秒出结果!!
列式存储要解决的问题:
- 把IO只给查询需要用到的数据
- 只加载需要被计算的列
- 空间节省
- 列式的压缩效果更好
- 可以针对数据类型进行编码
- 开启矢量化的执行引擎(不再1条1条的处理数据,而是一次处理1024条数据)
Parquet是列式存储的一种文件类型,是Hadoop