赞
踩
存储层是任何数据平台的核心,在基于lakehouse架构的平台中,它对于高效持久化各类数据、提高查询引擎的性能发挥着重要作用。
Lakehouse存储层由云存储、文件格式和表格式组成。
本文将说明与 Lakehouse 存储相关的基本概念、行式存储和列式存储之间的区别,以及存储格式是如何与性能密切相关的。
然后,将深入探讨用于数据分析场景的存储格式、使用每种格式的好处以及构建数据平台时应考虑的关键功能。
了解了上边的概念后将讨论湖仓一体中的开放表格式,包括其功能和优点,以及在使用的时候需要注意的地方。
存储层是数据生态系统的支柱,当实施数据平台时,将需要一个持久、可靠且高度可用的存储层,可以保存大量所有类型的历史数据。除了上述功能之外,lakehouse 平台还需要一个存储层,该存储层还可以实现快速检索、支持 ACID 功能并保留旧版本的数据。
所有创建表或在表中插入数据的操作,都会以文件形式存储在物理磁盘上。在现代数据平台中,一般使用云存储来保存数据,有两种存储数据的方法:行式存储和列式存储。
下边对行存储和列存储进行简单的介绍说明,如下图所示,有一个产品表:
product ID | name | type |
---|---|---|
1 | 键盘 | 电脑配件 |
2 | 耳机 | 电脑配件 |
3 | 手机壳 | 手机配件 |
行式存储将在物理磁盘上存储整行数据:
1 | 键盘 | 电脑配件 | 2 | 耳机 | 电脑配件 | 3 | 手机壳 | 手机配件 |
---|
当查询数据时,它会从磁盘读取完整的行。当查询想要读取数据中的所有列时,这非常有用。然而,数据分析工作一般只会查询指定的列,由于基于行的存储的性质,查询必须读取许多记录中的所有列,而不管查询所需的列数是多少,导致消耗资源大,查询效率低。
列式存储会对相同类型的数据进行压缩,只会扫描查询指定的列,而不会扫描整行数据,查询效率高。
存储不仅仅是保存数据,它还使计算引擎能够通过减少要扫描的数据来更快地检索所需的结果。决定性能的不仅是计算引擎,还有底层存储。
任何分析查询的数据检索时间都会受到扫描数据量的严重影响。扫描的数据越少,获取结果所需的时间就越短。现代文件和表格式有助于最大限度地减少查询检索结果所需扫描的数据,该过程被称为数据跳跃或行跳跃。
有多种方法可以跳过不需要的数据,包括:
Lakehouse存储层由三个主要部分组成,
存储层负责持久化保存 Lakehouse 架构中的所有数据,云存储最适合存储大量此类数据,这些数据的性质、类型、大小和接收速度各不相同。
下图显示了 Lakehouse 存储层以及可用于实现它的不同云对象存储技术:
存储特性
用于实现物理存储的技术应表现出以下基本特征:
大多数云厂商的云存储(S3, OSS等)都提供上边的特性,所以在实践 Lakehouse 架构时首选云对象存储,而不是 HDFS。
存储层中的下一个组件是文件格式,定义了在云存储上存储数据的方式:行存储或列存储。现代文件格式为了支持分布式处理的能力,会对文件数据进行压缩和分割成多个小文件。
一些流行的文件格式,包括 CSV、JSON 和 XML,在处理大数据时存在一些关键限制:
什么是可分割文件格式?
在分布式处理中,数据分布在各个集群上以支持并行处理。当文件存储在这些分布式存储上时,需要将其存储到各种数据块或块中,以便多个处理引擎可以读取这些块。用于存储数据的文件格式应该支持这种将文件分割成多个块的方式。大数据系统中的文件通常容量很大并经过压缩以节省存储空间并提高性能。它们的压缩形式应该是可拆分的,以执行分布式处理。大数据文件格式在使用支持的压缩算法(如 Snappy、LZO、BZIP2 等)进行压缩时支持此类拆分。但是,传统格式(如 CSV)在使用 GZIP 压缩进行压缩时无法进行拆分。
目前社区比较流行的三种压缩文件格式包括:
Parquet 提供比 CSV 和 JSON 文件格式更好的压缩比,并提供强大的处理复杂数据的性能。
文件结构
下图简单展示了 parquet 文件格式布局:
优点
与 parquet 一样,也是一种列式文件格式,是 Hive 标准 RC 格式的继承者。 Apache ORC 提供 ACID 支持,具有内置索引以加快数据检索速度,并支持结struct 、list 和map 等复杂数据类型。
文件结构
优点
文件结构
优点
除了和Apache Parquet 和 Apache ORC 一样的列式存储优点,Apache Avro 还提供了一些独特的功能,有助于存储和处理大量数据:
所有这些文件格式的目的都是为了有效地存储数据并提高读取数据时的查询性能。这三者都具有类似的功能,有助于实现这些目标;然而,它们根据存储和压缩数据的方法存在关键差异,下边是其中的相似点和差异点说明。
支持的数据格式
压缩
下图是使用它们进行压缩 2G CSV 数据,三种压缩率对比:
可拆分
使用场景
文件存储格式
扫描数据
CSV 和 Avro 格式创建的表上运行的查询扫描了完整的数据,而 ORC 和 Parquet 表扫描的数据非常少,只扫描了所需的列
schema 推演
说明
对于查询分析工作方式,列式存储最适合数据检索。 ORC 和 Parquet 都提供良好的压缩级别并支持更快的数据检索。然而,ORC 最适合 Hive,而 Parquet 与 Apache Spark 适配很好。考虑到大多数现代供应商数据平台都采用了 Parquet,我们可以将其视为存储分析数据的首选。可以使用 Avro 对其进行补充,以存储 ETL 过程中使用的原始数据。在选择存储文件格式之前,我们应该仔细考虑使用场景。
表格格式有助于组织每个表格的数据文件,它由与数据文件相关的信息组成,如schema 详细信息、文件创建/更新时间、每个文件中的记录数、记录级别操作类型(添加/删除)等。表格式使数据湖具有 ACID 功能,支持更新/删除和数据跳过功能,从而提高查询的性能。
Hive 拥有 Hive-Server 2 (HS2)、Hive Metastore (HMS) 和 Beeline(Hive 命令行界面)等关键组件作为其服务的一部分。它使用 HDFS 存储数据并使用 MapReduce 处理数据。
说明
Hive 有一个称为 Hive Metastore (HMS) 的中央元数据存储库,用于存储 Hive 表的schema 详细信息。它还存储与每个表的分区相关的信息。 许多数据平台都使用 HMS 作为存储元数据的元存储。
hive 表目录结构如下:
当在 Hive 中创建表时,它会将数据存储在 HDFS 中,将 schema 存储在 HMS 中。 Hive 表目录包含其根表文件夹下的所有文件。如果对该表进行分区,它将创建额外的分区级目录并将相关数据文件放置在这些目录下。
数据始终驻留在数据湖(在本例中为 HDFS,也可以在 OSS 对象存储)上,不会加载到任何其他专用仓库存储中,从而使用户能够构建像 Lakehouse 这样仅具有单个存储层的系统。
优点
缺点
无法通过执行 SQL 命令直接更新或删除 Hive 表中存在的任何记录。由于数据驻留在不可变的 HDFS 上,因此没有直接的方法来更新或删除记录。如果要修改一些记录,则必须首先识别它们所在的分区,删除所有这些分区,然后使用修改的记录重新创建整个分区。这会导致更长的处理时间以及不必要的大量数据删除/重新创建。
所有这些限制导致了Hive 成为现代表格格式的演变,社区后边推出了Apache Iceberg、Apache Hudi 和 Delta Lake 三种现代表格格式,数据存储在云对象存储中,它们只提供事物机制:
Apache Iceberg由两大部分组成——元数据层和数据层:
Catalog
catalog 列出了表位置并指向最新的元数据文件
元数据层
元数据层由多个元素组成:
数据层
Apache Iceberg 支持 Apache Parquet、Apache ORC 和 Apache Avro 文件存储格式。
ACID 支持
schema 推演
隐藏分区
分区演变
时间回溯(重点)
支持的文件格式
Hudi(Hadoop Upserts Deletes and Incrementals)代表其执行记录级更新插入和删除以及支持增量数据处理的能力。
文件结构如下:
元数据层
Apache Hudi 将事务日志存储在 .hoodie 目录中。表元数据存储在 .hoodie 目录下的元数据目录中。 Apache Hudi 还创建一个“hoodie.properties”文件来保存表级配置,适用于写入和读取数据。
数据层
根据用于表分区的列,在基本路径下为不同的列值创建子目录来存储数据文件。 Apache Hudi 将这些数据文件存储为基本文件或日志文件。
Apache Hudi 提供了多种可以帮助实现 Lakehouse 平台的功能:
支持 ACID、更新和删除
时间回溯
优化过的查询性能
提交时间线
支持的查询类型
Apache Hudi 支持三种类型的查询
表格类型
Apache Hudi 支持两种类型的表格式:写入时复制 (COW) 和读取时合并 (MOR),对查询性能进行优化。
它支持多种计算引擎,包括 Apache Spark、PrestoDB 和 Trino。与 Iceberg 和 Hudi 一样,Delta Lake 也为数据湖提供事务功能,使其具有类似数据仓库的功能。
文件目录结构
元数据层
元数据层由一个“_delta_log”文件夹组成,其中保存 Delta Lake 为每个事务创建的 JSON 文件。这些 JSON 文件包含元数据和事物信息。元数据包含与表schema 相关的详细信息,包括属性名称、类型以及是否可为空。它还保存有关分区的信息。该事务保存数据文件、大小、修改时间以及每个属性中的值的详细信息。
数据层
Delta Lake 使用 Apache Parquet 文件格式存储数据,并使用 Snappy 作为默认的数据压缩算法。
ADID 支持
更新/删除/合并支持
时间回溯
schema 使用和推演
批处理和流处理统一
数据回收
压缩合并小文件
克隆
ACID 支持
Iceberg、Hudi 和 Delta Lake 都为事物性提供 ACID 保证,它们还使数据湖能够以高性能的水平支持更新/删除操作。这一特性使得这些技术适合实现 Lakehouse 架构,并将它们与之前数据湖广泛采用的Hive 表格式区分开来。
时间回溯
时间回溯是 Lakehouse 平台的关键功能之一,所有三种表格格式都支持它。这些表格式中的每一种都可以保留旧版本的数据,并根据时间戳的版本号来恢复它。
schema 推演
所有三种格式都支持schema 推演功能,可以轻松添加、删除或重命名列,而无需再次重写数据。
支持增量数据处理
Apache Hudi 通过跟踪变更流的追加、更新和删除来支持高效的增量处理。它具有索引级记录来有效地处理这些流。
Delta Lake 也有一个类似的功能,叫做更改数据源。
Apache Iceberg 有类似的功能,但仅支持追加。缺少对替换、覆盖和删除的支持。
分区和集群
Apache Iceberg 有一个独特的功能来支持分区演化,它可以帮助我们更新分区而无需重写数据。Apache Hudi 使用集群来提高查询性能并随着数据的演变调整数据分区。
支持的文件格式
Apache Iceberg 支持 Parquet、ORC 和 Avro 文件格式。 Apache Hudi 支持 Parquet 和 ORC,而 Delta Lake 仅支持 Parquet。
所有三种表格式都支持 Parquet,这是现代数据平台最常用的文件格式。
数据质量验证
Delta Lake 支持约束以确保数据质量和完整性。它提供“NULL”约束来验证 NULL 值,并提供“CHECK”约束来验证每个输入记录的指定布尔表达式(示例,product_id > 10)是 true 还是 false。
Apache Hudi 还有一个称为“预提交验证器”的功能,用于在写入数据时检查数据质量。 Apache Iceberg 尚不具备此类验证功能。
选型和使用场景
所有三种格式都最适合实施基于 Lakehouse 的数据平台。各种产品供应商已开始支持这些格式作为其服务的一部分。 Delta-Parquet 是公司用来在 Azure 上实施用例的流行组合。 Delta Lake 在 Spark 中表现出出色的性能,是 Spark 密集型生态系统的首选之一。使用 AWS 的公司已开始采用 Hudi,因为 AWS 具有深度 Hudi 集成。许多公司正在考虑 Iceberg,因为它支持多种文件格式、分区演变功能以及许多供应商产品的支持,包括 Dremio、Tabular、Starburst 和 Snowflake。
注意:
这些是我们在设计 Lakehouse 平台时可以考虑的一些关键功能,我们可以根据我们的使用场景考虑多种其他功能。但是,我们应该避免根据最新版本中的可用功能做出设计决策。所有这些格式都在不断发展,迟早会开始支持缺失的功能。在设计系统时还应该考虑其他关键因素。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。