textfile、sequencefile、rcfile 和 orcfile 是 Hadoop 生态系统中几种常见的文件存储格式,它们各有优劣,适用于不同的场景。
下面我将详细解释它们的区别,并用一个表格进行总结。
1. TextFile
- 定义:最常见的文件格式,即纯文本文件。Hadoop 中默认的存储格式。每行都是一条记录。
- 特点:
- 可读性强:可以使用文本编辑器直接打开查看(如 CSV, TSV, JSON 字符串等)。
- 存储空间大:不进行任何压缩,或者压缩比不高(如 Gzip)。存储效率低。
- 解析开销大:需要逐行解析文本,反序列化开销大,性能较差。
- 不支持块压缩:通常只支持文件级别的压缩,不利于并行处理。
- 不支持 schema:需要额外的处理来解析字段(例如,用分隔符分割的 CSV)。
- 适用场景:
- 数据交换或初始数据加载。
- 需要人类直接查看和编辑的中间数据。
- 小规模数据或测试环境。
2. SequenceFile
- 定义:一种由二进制键值对组成的 Hadoop 特定文件格式。常用于作为 MapReduce 作业之间的中间输出格式。
- 特点:
- 二进制格式:不可直接查看,需要专用工具。
- 支持压缩:支持记录压缩(Record Compression)和块压缩(Block Compression)。块压缩效率高,且支持切片(Splittable),非常适合 MapReduce 处理。
- 可切片:即使压缩后,也可以被切分成多个块,由多个 Mapper 并行处理。
- 存储效率高于 TextFile:但通常仍低于列式存储格式(ORC, Parquet)。
- 适用场景:
- MapReduce 作业中间数据的存储。
- 存储小文件(Hadoop 喜欢大文件,可以将多个小文件合并成一个 SequenceFile)。
- 需要二进制格式且支持切片压缩的场景。
3. RCFile (Record Columnar File)
- 定义:行列混合存储格式。它是 ORC 文件格式的前身。
- 特点:
- “先水平划分,再垂直划分”:首先将数据按行分组成多个行组(Row Group),然后在每个行组内,按列存储数据。
- 兼顾行式和列式的优点:
- 列式存储优点:同一列的数据在一起,压缩编码效率高,适合扫描特定列的查询。
- 行式存储优点:同一个行组内的行数据在物理上相邻,适合需要访问整行数据的查询。
- 压缩比和查询性能优于 SequenceFile,但比后续的 ORC 和 Parquet 差。
- 适用场景:
- 现在已不推荐使用,基本上被性能更优的 ORC 或 Parquet 所取代。了解它主要是为了理解列式存储的演进历史。
4. ORCFile (Optimized Row Columnar File)
- 定义:对 RCFile 的优化,是一种高效的列式存储格式。由 Hive 项目创建并大力推广。
- 特点:
- 极高的压缩比:采用先进的压缩算法(如 ZLIB, Snappy),并针对列数据的特点进行编码(如 Run-Length Encoding, Dictionary Encoding),大幅减少磁盘空间。
- 查询性能极快:列式存储允许查询只读取所需的列,大大减少了 I/O 数据量。支持谓词下推(Predicate Pushdown),在读取数据时就过滤掉不需要的行组。
- 内置高级特性:
- 索引:包括轻量级的布隆过滤器(Bloom Filter)和索引,可以快速跳过不符合条件的数据块。
- 支持复杂数据类型:如 Map, List, Struct。
- 支持 ACID 事务:Hive 中使用 ORC 格式可以实现事务操作。
- 可切片:文件由多个 Stripe(相当于行组)组成,支持并行处理。
- 适用场景:
- Hive 数据仓库的默认首选格式。
- 需要极高压缩比和快速查询响应的 OLAP 场景。
- 频繁进行聚合查询、只涉及部分列的查询。
总结对比表格
| 特性 | TextFile | SequenceFile | RCFile | ORCFile |
|---|---|---|---|---|
| 存储格式 | 行式存储 | 行式存储(二进制KV) | 行列混合存储 | 列式存储 |
| 可读性 | 高(纯文本) | 低(二进制) | 低(二进制) | 低(二进制) |
| 压缩比 | 低 | 中等 | 中高 | 极高 |
| 查询性能 | 低 | 中等 | 中高 | 极高(支持谓词下推、索引) |
| 是否可切片 | 是(未压缩时) | 是(支持块压缩) | 是 | 是 |
| Schema 支持 | 无(需额外解析) | 弱 | 有 | 强(内置类型信息) |
| 主要优势 | 通用、可读 | 可切片、二进制中间格式 | 列式存储的早期探索 | 压缩、性能、功能丰富 |
| 主要场景 | 数据交换、日志 | MapReduce 中间结果、小文件合并 | (已过时) | Hive 数据仓库、OLAP |
如何选择?
- 数据交换和初步探索:使用 TextFile(如 CSV, JSONL)。
- 处理 MapReduce 中间结果:使用 SequenceFile。
- 构建数据仓库,进行高性能分析查询:绝对首选 ORC(或 Parquet,另一个非常流行的列式存储格式,通常在 Spark 和 Impala 生态中更常见)。
- RCFile:无需考虑,已被 ORC 完美取代。
简单来说,从 TextFile 到 ORCFile,是一个从通用可读到专用高性能的演进过程,也是从行式存储到列式存储的演进过程。在现代大数据架构中,ORC 和 Parquet 是事实上的标准列式存储格式。
362

被折叠的 条评论
为什么被折叠?



