前言
该文章中将会整理一些大数据中常见的文件格式及压缩算法的理论知识,作为后期实践的理论指导。理论+实践才会更方便用这些文件格式和压缩算法。
目前hadoop中常见的文件格式有textfile、sequencefile、avro、rcfile、orcfile、parquet等,上述六种文件格式又可以划分为行式存储(textfile、sequencefile、avro)和列式存储(rcfile、orcfile、parquet)。那么什么是行式存储?什么又是列式存储呢?
一、行式存储及列式存储
1.行式存储
行式存储就是每一行的所有数据存在一个block中,各个block之间连续存储。
优点:
- 因为每一行的所有字段都存在一起,因此对数据进行插入(INSERT)和修改(UPDATE)操作很方便。
- 整表查询比较方便,可以很快将整张表组装出来。
缺点:
- 查询(SELECT)时如果涉及到某条数据,需要把该行数据所有内容都读取到内存中,即使只SELECT一两个字段也要把整行数据都读进来。读取数据的时候硬盘寻址范围很大。
- 要加速查询的话需要建立索引,建立索引需要花费很多时间。
- 空值也要占固定的空间。
应用场景:
行式存储用于存储关系型数据,用于使用数据的时候需要经常用到数据之间的依赖关系的场景,即读取的时候需要整行数据或者整行中大部分列的数据,需要经常用到插入、修改操作,比如存储用户的注册信息等。
2.列式存储
列式存储就是每一列的所有数据存在一起,不同列之间可以分开存储。
优点:
- 每一列单独存储,因此仅SELECT个别列的时候,可以仅读取需要的那几个列,相当于为每一列都建立了索引。因此硬盘寻道范围小。
- 数据压缩。列式存储的时候可以为每一列创建一个字典,存储的时候就仅存储数字编码即可,降低了存储空间需求
缺点:
- SELECT完成时,被选中的数据需要重新组装。
- 插入(INSERT)和修改(UPDATE)操作比较麻烦。
应用场景:
列式存储适合分布式数据库和数据仓库,适合于对大量数据进行统计分析,列与列之间关联性不强,仅进行插入和读取操作的场景,如网站流量统计、用户行为分析等。
二、具体的文件格式
看完具体的大类划分,我们再看看具体的文件格式。
1. TextFile
默认格式,存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大。可结合 Gzip、Bzip2 使用(系统自动检查,执行查询时自动解压),但使用 这种方式,压缩后的文件不支持 split,Hive 不会对数据进行切分,从而无法对数据进行并行操作。并且在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比 SequenceFile 高几十倍 。
2. SequenceFile
SequenceFile 是 Hadoop API 提供的一种二进制文件支持,存储方式为行存储,其具有使用方便、可分割、可压缩的特点。SequenceFile 支持三种压缩选择:NONE,RECORD,BLOCK。Record 压缩率低,一般建议使用 BLOCK 压缩。优势是文件和 hadoop api 中的 MapFile 是相互兼容的 。
3. Avro
Avro格式是Hadoop的一种基于行的存储格式,被广泛用作序列化平台。Avro格式以JSON格式存储模式,使其易于被任何程序读取和解释。数据本身以二进制格式存储,使其在Avro文件中紧凑且高效。Avro格式是语言中立的数据序列化系统。它可以被多种语言处理(目前是C、C++、C#、Java、Python和Ruby)。Avro格式的一个关键特性是对随时间变化的数据模式的强大支持,即模式演变。Avro处理模式更改,例如缺少字段、添加的字段和更改的字段。Avro格式提供了丰富的数据结构。例如,您可以创建包含数组、枚举类型和子记录的记录。
4. RCFile
RCFile是为基于MapReduce的数据仓库系统设计的数据存储结构。它结合了行存储和列存储的优点,可以满足快速数据加载和查询,有效利用存储空间以及适应高负载的需求。RCFile是由二进制键/值对组成的flat文件,它与sequence file有很多相似之处,在数仓中执行分析时,这种面向列的存储非常有用。当我们使用面向列的存储类型时,执行分析很容易。缺点是RC不支持schema扩展,如果要添加新的列,则必须重写文件,这会降低操作效率。
5. OrcFile
Apache ORC是Apache Hadoop生态系统面向列的开源数据存储格式,它与Hadoop环境中的大多数计算框架兼容,ORC代表“优化行列”,它以比RC更为优化的方式存储数据,提供了一种非常有效的方式来存储关系数据,然后存储RC文件。ORC将原始数据的大小最多减少75%,数据处理的速度也提高了。
6. Parquet
与以行方式存储数据的传统方法相比,Parquet文件格式在存储和性能方面更高效。这对于从“宽”(具有许多列)表中读取特定列的查询特别有用,因为只读取需要的列,并且最小化 IO。Parquet的独特功能之一是它也可以以柱状方式存储具有嵌套结构的数据。这意味着在 Parquet 文件格式中,即使是嵌套字段也可以单独读取,而无需读取嵌套结构中的所有字段。Parquet 格式使用记录分解和组装算法以柱状方式存储嵌套结构。
三、压缩算法
压缩格式 |
工具 |
算法 |
文件扩展名 |
是否可切分 |
default/deflate |
无 |
deflate |
.deflate |
否 |
gzip |
gzip |
deflate |
.gz |
否 |
bzip2 |
bzip2 |
bzip2 |
.bz2 |
是 |
lzo |
lzop |
lzo |
.lzo |
否 |
lz4 |
无 |
lz4 |
.lz4 |
否 |
snappy |
无 |
snappy |
.snappy |
否 |
四、总结
Hadoop支持的文件格式和压缩算法非常多,每种文件格式和压缩算法都有自己独特的特点和一定的应用场景。下一期我们讲讲这些内容,并选择合适的文件格式和压缩算法组合,作为默认的文件格式和压缩算法。
如有错误,不吝指正。
参考文章
- https://zhuanlan.zhihu.com/p/459444652
- https://www.51cto.com/article/615292.html
- https://segmentfault.com/a/1190000040823167
- https://blog.csdn.net/longyanchen/article/details/97160466