Hadoop三种文件存储格式Avro、Parquet、ORC

2022-04-09  本文已影响0人  万州客

也是知识,要了解

URL:
https://zhuanlan.zhihu.com/p/459444652

为什么我们需要不同的文件格式?

对于 MapReduce 和 Spark 等支持 HDFS 的应用程序来说,一个巨大的瓶颈是在特定位置查找相关数据所需的时间以及将数据写回另一个位置所需的时间。这些问题随着管理大型数据集的困难而变得复杂,例如不断发展的模式或存储限制。

在处理大数据时,存储此类数据所需的成本更高(Hadoop 冗余存储数据以实现容错)。除了存储成本之外,处理数据还伴随着 CPU、网络、IO 成本等。随着数据的增加,处理和存储的成本也随之增加。

各种 Hadoop 文件格式在 数据工程解决方案中得到了发展,以缓解许多用例中的这些问题。

选择合适的文件格式可以带来一些显着的好处:

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

一些文件格式是为一般用途而设计的,另一些是为更具体的用例而设计的,还有一些是为特定数据特征而设计的。所以有相当多的选择。

Avro 文件格式

[图片上传失败...(image-1ec66-1649317507854)]

Avro 格式是 Hadoop 的一种基于行的存储格式,被广泛用作序列化平台。

Avro 格式以 JSON 格式存储模式,使其易于被任何程序读取和解释。

数据本身以二进制格式存储,使其在 Avro 文件中紧凑且高效。

vro格式是语言中立的数据序列化系统。它可以被多种语言处理(目前是 C、C++、C#、Java、Python 和 Ruby)。

Avro 格式的一个关键特性 是对随时间变化的数据模式的强大支持,即模式演变。Avro 处理模式更改,例如缺少字段、添加的字段和更改的字段。

Avro 格式提供了丰富的数据结构。例如,您可以创建包含数组、枚举类型和子记录的记录。

[图片上传失败...(image-aa93b7-1649317507854)]

Avro 格式是在数据湖登陆区存储数据的理想选择,因为:

1.落地区的数据通常被整体读取,以供下游系统进一步处理(这种情况下基于行的格式效率更高)。

2. 下游系统可以轻松地从 Avro 文件中检索表模式(无需将模式单独存储在外部元存储中)。

3. 任何源模式更改都很容易处理(模式演变)。

列式存储格式

为了更好地理解 Hadoop 中的 Parquet 和ORC 文件格式,首先我们来看看什么是列式存储格式。在面向列的格式中,记录中相同类型的每一列的值存储在一起。

例如 ,如果有一条记录包含 ID、员工姓名和部门,则 ID 列的所有值将存储在一起,Name 列的值将存储在一起,等等。如果我们采用与上述相同的记录模式,具有三个字段 ID (int)、NAME (varchar) 和 Department (varchar),则该表将如下所示:

[图片上传失败...(image-c1bf62-1649317507854)]

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">添加图片注释,不超过 140 字(可选)</figcaption>

对于此表,按行存储格式的数据将按如下方式存储:

[图片上传失败...(image-b537ba-1649317507854)]

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">添加图片注释,不超过 140 字(可选)</figcaption>

然而,面向列的存储格式中的相同数据将如下所示:

[图片上传失败...(image-7a4f5d-1649317507854)]

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">添加图片注释,不超过 140 字(可选)</figcaption>

当您需要从表中查询几列时,列式存储格式更有效。它将只读取所需的列,因为它们是相邻的,从而最小化 IO。

例如,假设您只需要 NAME列。 在行存储格式中,必须加载数据集中的每条记录,将其解析为字段,并提取名称的数据。面向列的格式可以直接转到 Name 列,因为该列的所有值都存储在一起。它不需要遍历整个记录。

因此,面向列的格式提高了查询性能,因为转到所需列所需的查找时间更少,并且由于只需要读取需要数据的列,因此需要更少的 IO。

Parquet文件格式

[图片上传失败...(image-a510fc-1649317507854)]

Parquet 是 Hadoop 的一种开源文件格式,以扁平列格式存储嵌套数据结构。

Parquet文件格式优点

[图片上传失败...(image-c3759b-1649317507853)]

Parquet 文件格式结构组成

[图片上传失败...(image-41c9ac-1649317507854)]

ORC 文件格式

[图片上传失败...(image-f37441-1649317507854)]

优化行列式 ( ORC ) 文件格式提供了一种高效的数据存储方式。 它旨在克服其他文件格式的限制。ORC 文件格式理想地存储紧凑的数据,并允许跳过不相关的部分,而无需大型、复杂或手动维护的索引。ORC 文件格式解决了所有这些问题。

ORC 文件格式优点

[图片上传失败...(image-a34fff-1649317507854)]

ORC 文件格式将行集合存储在一个文件中,并且在集合中,行数据以列格式存储。

ORC 文件包含称为stripe的行数据组和File footer(文件页脚)中的辅助信息 。默认stripe大小为 250 MB。大stripe大小支持从 HDFS 进行大量、高效的读取。

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 的压缩效率更高。
上一篇下一篇

猜你喜欢

热点阅读