暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DuckDB+Iceberg | 数据湖体验迈上新台阶

alitrack 2025-03-27
22

DuckDB+Iceberg | 数据湖体验再度增强

原文

https://aws.amazon.com/cn/blogs/storage/streamlining-access-to-tabular-datasets-stored-in-amazon-s3-tables-with-duckdb/

https://duckdb.org/2025/03/14/preview-amazon-s3-tables.html

TL;DR:我们很高兴地宣布推出一项新的预览功能,该功能增加了对 Apache Iceberg REST 目录的支持,使 DuckDB 用户能够轻松连接到 Amazon S3 Table 和 Amazon SageMaker Lakehouse。

AWS 博客也发布了有关此功能的帖子,请参阅: 使用 DuckDB 简化对存储在 Amazon S3 表中的表格数据集的访问。

  • https://aws.amazon.com/cn/blogs/storage/streamlining-access-to-tabular-datasets-stored-in-amazon-s3-tables-with-duckdb/

Iceberg 很火

近年来,Iceberg 开放表格式越来越受欢迎。Databricks 、 Snowflake、 Google BigQuery 和 AWS等主要数据仓库平台 都已宣布或已实现对 Iceberg 表的支持。这些平台还支持 Iceberg catalog (目录),负责跟踪按命名空间分组的 Iceberg 表集合的元数据。

DuckDB自 2023 年 9 月起通过iceberg扩展支持读取 Iceberg 表。

今天,我们很高兴在此扩展中引入一项新的预览功能,该功能允许附加到Iceberg REST catalog(rest是一种catalog)。此预览版本与昨天的两项 AWS 公告相吻合:Amazon S3 Tables 对 Iceberg 表的支持以及S3 Tables 与 SageMaker Lakehouse (AWS Glue 数据目录) 之间集成的 GA 版本。实际上,这些发展意味着 DuckDB 现在提供了用于读取S3 Tables和SageMaker Lakehouse中的 Iceberg 表的端到端解决方案。

 DuckDB 对 Amazon S3 表中 Iceberg REST 目录端点的支持是 AWS 和 DuckDB Labs 合作的结果。

PS:

  • DuckDB作为提升端点(计算端)计算能力的嵌入式OLAP数据库, 它要发展势必需要和另一个端点(存储端)进行紧密结合, 例如S3.

在 DuckDB 中使用 Apache Iceberg REST 目录

安装步骤

要连接到 DuckDB 中的 Apache Iceberg REST 目录,请确保您正在运行最新的稳定DuckDB 版本(版本 1.2.1)。对于我们的示例步骤,我们将使用 DuckDB CLI 客户端。您可以从安装页面获取此客户端并使用以下命令启动它:

duckdb  

复制

接下来,我们需要从core_nightly存储库中安装所需扩展的“前沿”版本。

FORCE INSTALL aws FROM core_nightly;  
FORCE INSTALL httpfs FROM core_nightly;  
FORCE INSTALL iceberg FROM core_nightly;  

复制

有关使用core_nightly存储库的更多信息,请参阅帖子末尾的注释。

安装这些扩展后,您的 DuckDB 现在可以使用 Apache Iceberg REST 目录。让我们查找一些数据。

设置 Amazon S3 表存储桶

(如果您已经在 Amazon S3 表中拥有 Iceberg 表,则可以跳至“使用 DuckDB 读取 Iceberg 目录”部分。)

在本博文中,我们将演示如何从 Amazon S3 表中读取数据。要继续操作,请确保您的账户具有s3tables权限 并创建一个新的S3 表存储桶。请注意,Amazon S3 表目前仅在选定的 AWS 区域受支持。

填充 Amazon S3 表存储桶

如果您还没有包含表的 S3 表存储桶,我们发现最简单的方法是使用 Amazon Athena
 创建表。请参阅他们的说明。在我们的示例中,我们使用 Athena 查询编辑器创建了一个包含三列的简单表:

CREATE TABLE duck_species (  
    id INT,  
    english_name STRING,  
    latin_name STRING  
) TBLPROPERTIES ('table_type' = 'ICEBERG');  

复制

让我们向表中插入一些数据:

INSERT INTO duck_species VALUES  
    (0, 'Anas nivis''Snow duck');  

复制

以上操作在Amazon Athena
中完成.

使用 DuckDB 读取 Amazon S3 表

使用 DuckDB 查询 S3 表非常简单。第一步是将您的 AWS 凭证放入 DuckDB。您可以通过两种方式实现此目的。首先,您可以让 DuckDB 根据目录中的默认配置文件检测您的 AWS 凭证和配置,方法是使用Secrets Manager 创建以下~/.aws
密钥管理:

CREATE SECRET (  
    TYPE s3,  
    PROVIDER credential_chain  
);  

复制

或者,您可以手动设置 AWS 密钥、机密和区域值。例如:

CREATE SECRET (  
    TYPE s3,  
    KEY_ID 'AKIAIOSFODNN7EXAMPLE',  
    SECRET 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',  
    REGION 'us-east-1'  
);  

复制

要查看会话中的密钥管理内容,请运行FROM duckdb_secrets();

接下来,将 DuckDB 指向您的 S3 表存储桶。您可以直接从 AWS 管理控制台复制粘贴 S3 表 ARN 值并在ATTACH命令中使用它来执行此操作:

ATTACH 'arn:aws:s3tables:us-east-1:111122223333:bucket/bucket_name'  
    AS s3_tables_db (  
        TYPE iceberg,  
        ENDPOINT_TYPE s3_tables  
    );  

复制

就这样!现在,DuckDB 已连接到 Amazon S3 表。要显示可用表,请运行:

SHOW ALL TABLES;  
  
┌──────────────┬─────────┬───────────────┬──────────────┬──────────────┬───────────┐  
│   database   │ schema  │     name      │ column_names │ column_types │ temporary │  
│   varchar    │ varchar │    varchar    │  varchar[]   │  varchar[]   │  boolean  │  
├──────────────┼─────────┼───────────────┼──────────────┼──────────────┼───────────┤  
│ s3_tables_db │ ducks   │ duck_species  │ [__]         │ [INTEGER]    │ false     │  
└──────────────┴─────────┴───────────────┴──────────────┴──────────────┴───────────┘  

复制

您可以像查询普通 DuckDB 表一样查询这些表:

FROM s3_tables_db.ducks.duck_species;  
  
┌───────┬──────────────┬────────────┐  
│  id   │ english_name │ latin_name │  
│ int32 │   varchar    │  varchar   │  
├───────┼──────────────┼────────────┤  
│   0   │ Anas nivis   │ Snow duck  │  
└───────┴──────────────┴────────────┘  

复制

您还可以使用 Amazon SageMaker Lakehouse (AWS Glue 数据目录) Iceberg REST catalog (目录)终端节点连接到 S3 表。为此,请运行:

ATTACH 'account_id:s3tablescatalog/namespace_name'  
AS (  
    TYPE iceberg,  
    ENDPOINT_TYPE glue  
);  

复制

如果您需要对单个 S3 表存储桶中的表格数据进行基本读取访问,请使用s3_tables终端节点类型。如果您希望在 AWS 中统一查看所有表格数据,请使用glue终端节点类型。

Iceberg 模式演化

Iceberg 格式的一个关键特性是模式演变,即能够跟踪表模式的变化。为了演示这一点,我们返回 Athena 查询编辑器并向表中添加一个 new column duck_species

ALTER TABLE duck_species  
    ADD COLUMNS (conservation_status STRING);  

复制

然后,我们再插入几个鸭子品种:

INSERT INTO duck_species VALUES  
    (1, 'Anas eatoni''Eaton''s pintail''Vulnerable'),  
    (2, 'Histrionicus histrionicus''Harlequin duck''Least concern');  

复制

让我们再次从 DuckDB 运行查询:

FROM s3_tables_db.ducks.duck_species;  

复制

查询现在返回一个带有附加第四列的表,该NULL列在架构更改之前插入的行中包含一个值 - 正如预期的那样。

┌───────┬───────────────────────────┬─────────────────┬─────────────────────┐  
│  id   │       english_name        │   latin_name    │ conservation_status │  
│ int32 │          varchar          │     varchar     │       varchar       │  
├───────┼───────────────────────────┼─────────────────┼─────────────────────┤  
│     1 │ Anas eatoni               │ Eaton's pintail │ Vulnerable          │  
│     2 │ Histrionicus histrionicus │ Harlequin duck  │ Least concern       │  
│     0 │ Anas nivis                │ Snow duck       │ NULL                │  
└───────┴───────────────────────────┴─────────────────┴─────────────────────┘  

复制

结论

DuckDB 扩展的最新预览版iceberg支持使用 Iceberg REST 终端节点直接读取表。这样您就可以轻松查询 Amazon S3 表和 Amazon SageMaker Lakehouse(AWS Glue 数据目录)。截至目前,该扩展处于实验状态,正在积极开发中。我们将在今年晚些时候发布稳定版本。

使用core_nightly存储库

本博客文章中使用的扩展目前处于实验阶段,因此它们通过core_nightly存储库分发。如果您想切换回使用core存储库中的扩展,请按照扩展文档进行操作。

请注意,DuckDB 不支持重新加载扩展。因此,如果您遇到任何问题,请尝试在更新扩展后重新启动 DuckDB。

背景知识

Iceberg Catalog (目录)

https://www.tabular.io/apache-iceberg-cookbook/getting-started-catalog-background/

Iceberg Catalog 的作用、类型以及如何选择合适的 Catalog。

详细解读:

  • 什么是 Iceberg Catalog?

    • 元数据存储: Iceberg Catalog 是一个元数据存储,用于跟踪 Iceberg 表的结构、位置和历史版本。  它本质上是 Iceberg 表的 "目录"。
    • 与数据分离: Catalog 将元数据与实际的数据文件(存储在对象存储如 S3 或 HDFS 中)分离。  这使得 Iceberg 能够支持原子性的表更新和版本控制。
    • 发现和访问: Catalog 允许用户发现和访问 Iceberg 表,就像传统数据库中的表一样。  查询引擎(如 Spark、Flink、Trino)通过 Catalog 来获取表的元数据,从而知道如何读取和写入数据。
  • Catalog 的作用:

    • 表发现 (Table Discovery):  允许用户列出和查找可用的 Iceberg 表。
    • 模式管理 (Schema Management):  存储表的模式信息,包括列名、数据类型等。
    • 版本控制 (Version Control):  跟踪表的历史版本,允许用户回溯到之前的状态。
    • 原子性更新 (Atomic Updates):  确保对表的更新是原子性的,要么全部成功,要么全部失败。
    • 并发控制 (Concurrency Control):  管理多个用户或进程同时访问和修改表的情况。
  • 常见的 Iceberg Catalog 类型:

    • 优点: 与 AWS 生态系统集成良好,无需额外的元数据存储服务。
    • 缺点: 仅适用于 AWS 环境。
    • 优点: 灵活、可扩展,可以与各种后端存储集成。
    • 缺点: 需要部署和维护 REST 服务。
    • 优点: 无需额外的元数据存储服务。
    • 缺点: 不适合大规模部署,性能可能较差。
    • 优点: 成熟、稳定、易于集成。
    • 缺点: 依赖于 Hive Metastore 的部署和维护。
    • Hive Metastore:  最常见的 Catalog 类型,使用 Hive Metastore 作为元数据存储。  Hive Metastore 是一个流行的元数据管理系统,广泛用于 Hadoop 生态系统。
    • Hadoop Catalog:  使用 Hadoop 文件系统(如 HDFS)作为元数据存储。
    • REST Catalog:  通过 REST API 提供元数据访问。
    • AWS Glue Catalog:  使用 AWS Glue Data Catalog 作为元数据存储。
    • 自定义 Catalog:  允许用户实现自己的 Catalog,以满足特定的需求。
  • 如何选择合适的 Catalog?

    • 现有基础设施:  如果已经在使用 Hive Metastore 或 AWS Glue Data Catalog,那么选择相应的 Catalog 是最简单的。
    • 部署环境:  如果部署在 Hadoop 集群上,可以选择 Hadoop Catalog。  如果需要灵活的部署方式,可以选择 REST Catalog。
    • 规模和性能:  对于大规模部署,Hive Metastore 或 REST Catalog 通常是更好的选择。
    • 成本:  需要考虑部署和维护 Catalog 的成本。
  • 页面可能包含的示例:

    • 配置不同类型的 Iceberg Catalog 的示例代码。
    • 使用 SQL 查询 Iceberg 表的示例,展示 Catalog 的作用。

总结:

这个页面解释了 Iceberg Catalog 的核心概念和作用,并介绍了常见的 Catalog 类型以及如何选择合适的 Catalog。  理解 Catalog 是使用 Iceberg 的关键,因为它负责管理表的元数据,并允许查询引擎访问和操作数据。  该页面为读者提供了选择和配置 Iceberg Catalog 的基础知识。

总而言之,这个页面是 Iceberg 入门的重要一环,帮助读者理解 Iceberg 的架构和核心组件。

Iceberg Evolution (schema, partition, sort order等演化)

https://iceberg.apache.org/docs/1.7.1/evolution/#schema-evolution

这篇文章详细描述了 Apache Iceberg 如何处理表模式 (schema)、分区规范 (partition spec) 和排序顺序 (sort order) 的演化,也就是随着时间的推移,这些定义如何改变。 这是 Iceberg 的一个关键特性,允许表在不中断查询的情况下进行修改。

Iceberg 如何支持表模式、分区和排序的演化,以及相关的操作和注意事项。

详细解读:

  • 概述:

    • Iceberg 旨在支持表的演化,允许用户在不重写整个表的情况下更改表的结构和组织方式。
    • 演化操作是元数据操作,不会影响现有的数据文件。
    • Iceberg 使用版本控制来跟踪表的演化历史,允许用户查询表的历史版本。
  • 模式演化 (Schema Evolution):

    • 添加列 (Add Column):  向表中添加新列。
    • 删除列 (Drop Column):  从表中删除现有列。
    • 重命名列 (Rename Column):  更改列的名称。
    • 更新列类型 (Update Column Type):  更改列的数据类型。
    • 重新排序列 (Reorder Columns):  更改列的顺序(默认字段顺序, 例如: select *
      )。
    • 添加/删除/更新列的注释 (Add/Drop/Update Column Comments): 修改列的注释信息。
    • 支持的操作: Iceberg 支持以下模式演化操作:
    • 兼容性: Iceberg 确保模式演化操作是向前兼容的,这意味着使用旧模式的查询仍然可以读取使用新模式写入的数据。
    • NULL 值处理:  新添加的列通常会填充 NULL 值,直到有新的数据写入。
    • 数据类型转换:  更新列类型可能需要进行数据类型转换。Iceberg 会尝试自动进行类型转换,但某些转换可能需要用户手动处理。
    • ID 分配: Iceberg 使用唯一的 ID 来标识列,即使列被重命名或重新排序,ID 仍然保持不变。这确保了查询的正确性。
    • 示例: 页面可能会包含使用 SQL 或 API 进行模式演化的示例代码。
  • 分区演化 (Partition Evolution):

    • 支持的操作: Iceberg 允许更改表的分区规范。
    • 添加分区字段 (Add Partition Field):  添加新的分区字段。
    • 删除分区字段 (Drop Partition Field):  删除现有的分区字段。
    • 更改分区转换 (Change Partition Transform):  更改分区字段的转换方式(例如,从 year(ts)
       更改为 month(ts)
      )。
    • 影响: 更改分区规范只会影响新写入的数据。现有的数据仍然按照旧的分区规范进行组织。
    • 迁移: 如果需要将现有数据迁移到新的分区规范,可以使用 Iceberg 的重写表 (rewrite table) 功能。
    • 示例: 页面可能会包含使用 SQL 或 API 进行分区演化的示例代码。
  • 排序演化 (Sort Order Evolution):

    • 支持的操作: Iceberg 允许更改表的排序顺序。
    • 添加排序字段 (Add Sort Field):  添加新的排序字段。
    • 删除排序字段 (Drop Sort Field):  删除现有的排序字段。
    • 更改排序方向 (Change Sort Direction):  更改排序字段的排序方向(例如,从升序更改为降序)。
    • 影响: 更改排序顺序只会影响新写入的数据。现有的数据仍然按照旧的排序顺序进行组织。
    • 优化: 更改排序顺序可以提高查询性能,但需要权衡写入性能。
    • 示例: 页面可能会包含使用 SQL 或 API 进行排序演化的示例代码。
  • 注意事项:

    • 并发: 在进行演化操作时,需要注意并发问题。Iceberg 使用乐观锁来处理并发更新。
    • 事务: 演化操作是事务性的,要么全部成功,要么全部失败。
    • 元数据大小: 频繁的演化操作可能会导致元数据大小增加。需要定期清理旧的元数据版本。
    • 查询计划: 演化操作可能会影响查询计划。需要确保查询引擎能够正确处理表的演化历史。
  • 页面可能包含的示例:

    • 使用 SQL 语句进行模式、分区和排序演化的示例。
    • 使用 Iceberg API 进行演化的示例代码。
    • 展示如何查询表的历史版本的示例。

总结:

这个页面详细介绍了 Apache Iceberg 如何支持表模式、分区和排序的演化。 Iceberg 的演化特性允许用户在不中断查询的情况下更改表的结构和组织方式,这对于数据湖的灵活性和可维护性至关重要。 该页面提供了关于演化操作的详细信息,包括支持的操作、兼容性、注意事项和示例代码。 理解 Iceberg 的演化特性是使用 Iceberg 的关键。

总而言之,这个页面是 Iceberg 核心概念的深入讲解,对于理解 Iceberg 的设计理念和实际应用非常有帮助。

Iceberg 是什么

Iceberg 是一个高性能、开源的表格式数据湖存储格式,旨在解决 Hadoop 生态系统中传统数据湖格式(如 Hive 表)的诸多问题,例如:

  • 不可靠的元数据管理: Hive 元数据容易出错,导致数据丢失或不一致。
  • 缺乏 ACID 事务支持: 难以保证数据一致性,尤其是在并发写入的情况下。
  • 性能瓶颈: 查询性能受限于 Hive 元数据和底层存储格式。
  • 不支持数据版本管理和时间旅行: 难以进行数据回溯和审计。

Iceberg 的主要特点和优势:

  • ACID 事务: 提供原子性、一致性、隔离性和持久性,确保数据可靠性。
  • 高性能查询: 通过元数据优化、分区裁剪和数据局部性等技术,显著提升查询性能。
  • 模式演化: 支持灵活的模式演化,允许添加、删除和修改列,而无需重写数据。
  • 时间旅行: 允许查询历史版本的数据,方便数据回溯和审计。
  • 隐藏分区: 自动管理分区,简化数据管理和查询。
  • 支持多种计算引擎: 可以与 Spark、Flink、Presto、Trino 等主流计算引擎集成。
  • 云原生: 适用于云存储,如 AWS S3、Azure Blob Storage 和 Google Cloud Storage。

简单来说,Iceberg 就像一个更智能、更可靠的 Hive 表,它通过改进元数据管理、提供 ACID 事务和优化查询性能,使得数据湖更加易于使用和管理。

适用场景:

  • 构建高性能数据湖
  • 需要 ACID 事务支持的数据分析
  • 需要模式演化和时间旅行的数据管理
  • 需要与多种计算引擎集成的数据平台

总而言之,Iceberg 是一个现代化的数据湖存储格式,它正在成为构建高性能、可靠和易于管理的数据湖的首选方案。

Iceberg 和 Parquet文件的关系

简单来说:

  • Parquet 是数据存储格式: 就像 Excel 文件一样,Parquet 是一种高效的列式存储格式,用于存储实际的数据。它擅长压缩和查询,适合大数据分析。

  • Iceberg 是数据湖表格式: 就像一个数据库管理系统,Iceberg 管理着 Parquet 文件。它记录了哪些 Parquet 文件组成了你的表,以及这些文件的版本信息。

关系:

Iceberg 使用 Parquet 作为底层的数据存储格式。你可以把 Iceberg 看作是 Parquet 文件的“目录”和“版本控制系统”。

举例:

想象你有一个很大的 Excel 表格(Parquet 文件),你想不断更新它。

  • 没有 Iceberg: 每次更新,你都要创建一个新的 Excel 文件,并且手动记录哪个文件是最新版本。
  • 有了 Iceberg: Iceberg 会自动帮你管理这些 Excel 文件(Parquet 文件)。它会记录每次更新,并允许你查询特定版本的数据,或者回滚到之前的版本。

总结:

Parquet 存储数据,Iceberg 管理 Parquet 文件,提供 ACID 事务、版本控制等功能,让数据湖更像一个数据库。


文章转载自alitrack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论