大数据文件格式比较:AVRO vs. PARQUET vs. ORC


为什么我们需要不同的文件格式?对于 MapReduce 和 Spark 等支持 HDFS 的应用程序而言,一个巨大的瓶颈是在特定位置查找相关数据所需的时间以及将数据写回另一个位置所需的时间。这些问题随着管理大型数据集的困难而变得复杂,例如不断发展的模式或存储限制。
当我们在处理大数据时,存储此类数据所需的成本更高(Hadoop冗余存储数据以实现容错)。除了存储成本,处理数据还伴随着CPU、网络、IO等成本,随着数据的增加,处理和存储的成本也随之增加。
各种 Hadoop 文件格式已经演变为在许多用例中缓解这些问题的一种方式。
选择合适的文件格式可以带来一些显着的好处:

  1. 更快的读取时间
  2. 更快的写入时间
  3. 可拆分文件
  4. 模式演变支持
  5. 高级压缩支持

一些文件格式是为一般用途而设计的,另一些是为更具体的用例而设计的,还有一些是为特定数据特征而设计的。所以真的有很多选择。
 
Avro
Avro 是一种基于行的 Hadoop 存储格式,被广泛用作序列化平台。
Avro 以 JSON 格式存储模式,使其易于被任何程序读取和解释。
数据本身以二进制格式存储,使其紧凑且高效。
Avro 是一个语言中立的数据序列化系统。它可以被多种语言处理(目前是 C、C++、C#、Java、Python 和 Ruby)。
Avro 的一个关键特性是对随时间变化的数据结构的强大支持,即结构演变。Avro 处理结构更改,例如缺少字段、添加的字段和更改的字段。
Avro 提供了丰富的数据结构。例如,您可以创建包含数组、枚举类型和子记录的记录。
这种格式是在数据湖存储数据的理想选择,因为:
  • 1. 数据湖的数据通常作为一个整体被读取,以供下游系统进一步处理(在
  • 这种情况下,基于行的格式更有效) .
  • 2. 下游系统可以轻松地从文件中检索表模式(无需将数据结构单独存储在外部元存储中)。
  • 3. 任何源模式更改都很容易处理(结构演变)。

 
PARQUET文件格式
Parquet 是一种用于 Hadoop 的开源文件格式,以平面柱状格式存储嵌套数据结构。
与以行方式存储数据的传统方法相比,parquet 在存储和性能方面更高效。
这对于从“宽”(具有许多列)表中读取特定列的查询特别有用,因为只读取需要的列并且最小化 IO。
为了更好地理解 Hadoop 中的 Parquet 文件格式,首先我们来看看什么是列格式。在面向列的格式中,记录中相同类型的每一列的值存储在一起。
Parquet的独特功能之一是它也可以以柱状方式存储具有嵌套结构的数据。这意味着在 Parquet 文件格式中,即使是嵌套字段也可以单独读取,而无需读取嵌套结构中的所有字段。Parquet 格式使用记录分解和组装算法以柱状方式存储嵌套结构。
要了解 Hadoop 中的 Parquet 文件格式,您应该了解以下术语 -
  • 行组:将数据逻辑水平划分为行。行组由数据集中每一列的列块组成。
  • 列块:特定列的数据块。这些列块存在于特定的行组中,并保证在文件中是连续的。
  • 页面:列块被分成背靠背写的页面。这些页面共享一个共同的标题,读者可以跳过他们不感兴趣的页面。

此处,Header 仅包含一个幻数“PAR1”(4 字节),将文件标识为 Parquet 格式文件。
页脚包含以下内容 -
  • 文件元数据- 文件元数据包含所有列元数据起始位置的位置。读者应该首先读取文件元数据以找到他们感兴趣的所有列块。然后应该顺序读取列块。它还包括格式版本、架构和任何额外的键值对。
  • 文件元数据的长度(4 字节)
  • 幻数“PAR1”(4 字节)

 
ORC文件格式
提供了高效的方式来存储数据。它旨在克服其他文件格式的限制。它理想地存储紧凑的数据,并允许跳过不相关的部分,而无需大型、复杂或手动维护的索引。ORC 文件格式解决了所有这些问题。
ORC 文件格式有很多优点,例如:
  • 单个文件作为每个任务的输出,减少 NameNode 的负载
  • Hive 类型支持,包括 DateTime、decimal 和复杂类型(结构、列表、映射和联合)
  • 使用单独的 RecordReader 并发读取同一文件
  • 无需扫描标记即可拆分文件
  • 根据文件页脚中的信息,估计 Reader/Writer 的堆内存分配上限。
  • 使用协议缓冲区存储的元数据,允许添加和删除字段

ORC 将行集合存储在一个文件中,并且在集合中,行数据以列格式存储。
ORC 文件包含称为条带的行数据组,以及文件页脚中的辅助信息。在文件的末尾附有压缩参数和压缩页脚的大小。
默认条带大小为250 MB。大条带大小支持从 HDFS 进行大量、高效的读取。
文件页脚包含文件中的条带列表、每个条带的行数以及每列的数据类型。它还包含列级聚合计数、最小值、最大值和总和。
  • Stripe footer包含流位置的目录。
  • 行数据用于表扫描。
  • 索引数据包括每列的最小值和最大值以及行在每列中的位置。ORC 索引仅用于条带和行组的选择,而不用于回答查询。

 
AVRO与PARQUET
  1. AVRO 是一种基于行的存储格式,而 PARQUET 是一种基于列的存储格式。
  2. PARQUET 对于分析查询要好得多,即读取和查询比写入更有效。
  3. AVRO 中的写操作比 PARQUET 中的要好。
  4. 在模式演变方面,AVRO 比 PARQUET 成熟得多。PARQUET 仅支持模式追加,而 AVRO 支持功能强大的模式演变,即添加或修改列。
  5. PARQUET 非常适合查询多列表中的列子集。AVRO 是我们需要查询所有列的 ETL 操作的理想选择。

 
ORC 与 PARQUET
  1. PARQUET 更能存储嵌套数据。
  2. ORC 更有能力进行谓词下推。
  3. ORC 支持 ACID 属性。
  4. ORC 的压缩效率更高。