团队
为什么需要不同的文件格式?
支持 HDFS 的应用程序(例如 MapReduce 和 Spark)的主要性能瓶颈是搜索、读取和写入数据所需的时间。 如果我们有一个不断发展的模式而不是固定的模式,或者存在一些存储限制,那么管理大型数据集的难度就会使这些问题变得更加复杂。
处理大数据会增加存储子系统的负载 - Hadoop 冗余存储数据以实现容错。 除了磁盘之外,还加载处理器、网络、输入/输出系统等。 随着数据量的增长,处理和存储数据的成本也随之增加。
各种文件格式在
- 更快的阅读时间。
- 更快的录音时间。
- 共享文件。
- 支持模式演化。
- 扩展的压缩支持。
一些文件格式用于一般用途,另一些文件格式用于更特定的用途,还有一些文件格式旨在满足特定的数据特征。 所以选择范围真的是相当大。
Avro 文件格式
为 数据序列化 Avro 被广泛使用 - 它 基于字符串,即Hadoop中的一种字符串数据存储格式。 它以 JSON 格式存储架构,使其易于任何程序读取和解释。 数据本身是二进制格式,紧凑且高效。
Avro 的序列化系统是语言中立的。 文件可以用多种语言处理,目前有 C、C++、C#、Java、Python 和 Ruby。
Avro 的一个关键特性是它对随时间变化(即演化)的数据模式的强大支持。 Avro 理解架构更改 - 删除、添加或更改字段。
Avro 支持多种数据结构。 例如,您可以创建包含数组、枚举类型和子记录的记录。
此格式非常适合写入数据湖的着陆(过渡)区域(
因此,这种格式最适合写入数据湖的着陆区,原因如下:
- 来自该区域的数据通常会被完整读取,以便下游系统进一步处理 - 在这种情况下,基于行的格式更加高效。
- 下游系统可以轻松地从文件中检索模式表,无需将模式单独存储在外部元存储中。
- 对原始模式的任何更改都很容易处理(模式演变)。
镶木地板文件格式
Parquet 是 Hadoop 的开源文件格式,用于存储 平面柱状格式的嵌套数据结构.
与传统的行方式相比,Parquet 在存储和性能方面更加高效。
这对于从宽(多列)表中读取特定列的查询特别有用。 由于采用了文件格式,因此仅读取必要的列,因此 I/O 保持在最低限度。
一个小题外话和解释:为了更好地理解 Hadoop 中的 Parquet 文件格式,让我们看看什么是基于列(即柱状)格式。 这种格式将每列的相似值存储在一起。
ID
名字
问题类型
1
emp1
d1
2
emp2
d2
3
emp3
d3
以字符串格式保存数据如下:
1
emp1
d1
2
emp2
d2
3
emp3
d3
在柱状文件格式中,相同的数据将像这样保存:
1
2
3
emp1
emp2
emp3
d1
d2
d3
当您需要从表中查询多个列时,列式格式会更有效。 它只会读取所需的列,因为它们是相邻的。 通过这种方式,I/O 操作保持在最低限度。
例如,您只需要 NAME 列。 在
因此,列式格式提高了查询性能,因为它需要更少的查找时间来获取所需的列,并且减少了 I/O 操作的数量,因为只读取所需的列。
独特的功能之一
要了解 Hadoop 中的 Parquet 文件格式,您需要了解以下术语:
- 行组 (行组):将数据逻辑水平划分为行。 行组由数据集中每列的片段组成。
- 柱碎片 (列块):特定列的片段。 这些列片段位于特定的行组中,并保证在文件中是连续的。
- 页 (page):列片段被分成一页接一页地写入的页面。 这些页面有一个共同的标题,因此您在阅读时可以跳过不必要的页面。
这里的标题只包含神奇的数字 PAR1 (4 个字节),将文件标识为 Parquet 文件。
页脚内容如下:
- 包含每列元数据的起始坐标的文件元数据。 读取时,必须首先读取文件的元数据以找到所有感兴趣的列片段。 然后应按顺序读取列部分。 其他元数据包括格式版本、架构和任何其他键值对。
- 元数据长度(4 字节)。
- 幻数 PAR1 (4字节)。
ORC 文件格式
优化行列文件格式 (优化行列,
ORC格式的优点:
- 每个任务的输出都是一个文件,减少了NameNode(名称节点)的负载。
- 支持 Hive 数据类型,包括 DateTime、decimal 和复杂数据类型(struct、list、map 和 union)。
- 不同RecordReader进程同时读取同一个文件。
- 能够在不扫描标记的情况下分割文件。
- 根据文件页脚中的信息估计读/写进程的最大可能堆内存分配。
- 元数据以 Protocol Buffers 二进制序列化格式存储,允许添加和删除字段。
ORC 将字符串集合存储在单个文件中,并且在集合中,字符串数据以列式格式存储。
ORC 文件在文件的页脚中存储称为条带的行组和支持信息。 文件末尾的 Postscript 包含压缩参数和压缩页脚的大小。
默认条带大小为 250 MB。 由于条带如此之大,从 HDFS 读取数据的效率更高:在大的连续块中。
文件页脚记录了文件中的泳道列表、每泳道的行数以及每列的数据类型。 每列的计数、最小值、最大值和总和的结果值也写在那里。
片段的页脚包含流位置的目录。
扫描表时使用行数据。
索引数据包括每列的最小值和最大值以及每列中行的位置。 ORC 索引仅用于选择条带和行组,而不用于回答查询。
不同文件格式的比较
Avro 与 Parquet 相比
- Avro 是一种行存储格式,而 Parquet 将数据存储在列中。
- Parquet 更适合分析查询,这意味着读取操作和查询数据比写入更高效。
- Avro 中的写入操作比 Parquet 中的执行效率更高。
- Avro 更成熟地处理电路演进。 Parquet仅支持模式添加,而Avro支持多功能演化,即添加或更改列。
- Parquet 非常适合查询多列表中的列子集。 Avro 适用于我们查询所有列的 ETL 操作。
ORC 与 Parquet
- Parquet 可以更好地存储嵌套数据。
- ORC 更适合谓词下推。
- ORC 支持 ACID 属性。
- ORC 可以更好地压缩数据。
关于该主题还可以阅读什么:
来源: habr.com