Iceberg Catalog 的实现和迁移

Iceberg Catalog 的需求

Iceberg Catalog 的接口定义了各种 Catalog 需要实现的方法,主要包括列出存在的表,创建表,删除表,检查表是否存在,给表改名。

如果一个 Iceberg catalog 使用在生产中,主要需是原子更新当前元数据指针。因为在任意时刻,所有的读和写操作看到表的表的状态是相同的。两个并发的写入操作,第 2 个写入操作提交的时候不能覆写第 1 个写入操作对数据的修改,导致数据丢失。

各种 Iceberg Catalog 实现的比较

比较的主要维度包括:

  • 是否推荐用于生产环境
  • 是否需要外部系统,并且外部系统是自带的还是管理服务
  • 是否和大量的引擎和工具兼容
  • 是否支持多表和多语句的事务
  • 是否不绑定特定的云厂商

Hadoop Catalog

Hadoop Catalog 是最简单的,不依赖外部系统。可以使用任意文件系统,包括 HDFS, S3 等。

不推荐使用在生产环境,原因如下:

  1. 有些文件系统 rename 操作是原子的,有些不是。像 S3 的 rename 就不是原子的。
  2. 仅使用数据仓库目录来列出表。如果使用对象存储,仅能使用一个 bucket。
  3. 如果列出 namespaces(也就是 databases) 或者 tables,当 namespaces 或者 tables 的数量比较多时,可能遇到性能问题。
  4. 不能仅从 catalog 删除一个表但是保留数据。
spark-sql --master local[1] \
  --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
  --conf spark.sql.catalog.my_catalog1=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.my_catalog1.type=hadoop \
  --conf spark.sql.catalog.my_catalog1.warehouse=/warehouse/tablespace/managed/hive

Hive Catalog

Hive Catalog 广泛使用。使用 Hive Metastore 中 表的属性 location 作为表的路径。

优点:

  1. 被多种引擎和工具支持,不依赖云厂商。

缺点:

  1. 需要额外的 Hive Metastore 服务。
  2. 不支持涉及多表操作的一致性和原子性。

The AWS Glue Catalog

使用表 metadata_location 作为表的路径。

优点:

  1. AWS Glue 是管理的服务,不需要像 Hive Metastore 的额外开销。
  2. 和其他 AWS 服务紧密集成。

缺点:

  1. 不支持多表事务。
  2. 和 AWS 生态绑定。

如果你深度购买了 AWS 的服务,并且不需要多云方案。

The Nessie Catalog

优点:

  1. 使数据湖像 git 一样,意味着数据和相关的元数据可以版本化,像源代码一样管理。
  2. 支持多表事务和多语句事务。
  3. 不依赖云厂商。

缺点:

  1. 不是所有的引擎和工具支持,当前 Spark,Flink,Dremio, Presto, Trino 和 PyIceberg 支持。
  2. 你必须像使用 Hive Metastore 一样,自己启动一个 Nessie。

The REST Catalog

优点:

  1. 比较轻量,依赖更少,简化部署和管理,因为仅仅能发送标准 HTTP 请求即可。
  2. 比较灵活,可以放在任意能处理 HTTP 请求的服务上,并且后端存储可以任意选择。
  3. 不依赖云厂商。

缺点:

  1. 必须运行一个服务处理 Rest 请求。
  2. 没有开源实现,必须自己编写。
  3. 不是所有的引擎和工具支持,当前 Spark,Flink,Trino 和 PyIceberg, 和 SnowFlake 支持。

The JDBC Catalog

优点:

  1. 容易开始。
  2. 数据库提供高可用性。
  3. 不依赖云厂商。

缺点:

  1. 不支持多表事务。
  2. 所有的引擎和工具需要 jdbc 驱动。

Catalog 迁移

使用 Catalog cli

Nessi 项目提供一个开源迁移工具。提供两个功能:迁移和注册。这两个功能都不拷贝数据。并且都支持迁移表的整个历史。

  • migrate
    从旧的 catalog 迁移到新的 catalog。当迁移完成时,表就在旧的 catalog 中找不到了,是 move 操作。

  • register
    register 迁移后,不删除旧的 catalog 中表定义,可以用来预迁移的验证。
    使用 register,不能使用不同的 catalog 写入数据,这样会导致数据丢失。

不要在有任务使用旧 catalog 写入任务运行时进行迁移,这样会导致数据丢失。

建议小批次的迁移。
迁移命令:

java -jar iceberg-catalog-iceberg-catalog-migrator-cli-0.2.0.jar migrate 

使用引擎

spark 启动的时候设置两个 catalog

 --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
  --conf spark.sql.catalog.source_catalog1=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.target_catalog1=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.source_catalog1.xxx=xxx \
  --conf spark.sql.catalog.target_catalog1.xxx=xxx \

以上命令仅启动 spark-sql。

  • register_table

参数
table, metadata_file

CALL target_catalog.system.register_table('table_catalog.db1.table1', '/path/to/source_catalog_warehouse/db1/table1/metadata/xxx.json')

在新 catalog 上的修改,在源 catalog 看不到。

  • snapshot()
    在新 catalog 上的操作,在源 catalog 看不到。反过来也一样,在源 catalog 上的操作,在新 catalog 看不到。
CALL target_catalog.system.snapshot('table_catalog.db1.table1', 'target_catalog.db1.table1')
Iceberg CDC(Change Data Capture)是一种常见的数据同步方式,用于将数据库中的变更同步到其他系统或数据仓库中。Iceberg CDC 通常包括以下步骤: 1. 捕获变更:通过轮询数据库的事务日志或使用数据库提供的 CDC 功能捕获变更。对于每个变更,记录变更的类型、时间戳、表名、主键值和变更的数据。 2. 转换数据:将捕获的变更数据转换为目标系统可接受的格式。通常需要进行一些数据转换和规范化,确保数据的一致性和完整性。 3. 传输数据:将转换后的数据传输到目标系统。可以通过消息队列、HTTP 接口等方式传输数据。 4. 应用变更:在目标系统中应用变更。通常需要维护一个增量的数据集,以便每次同步只应用新增、修改和删除的变更,避免重复数据和性能问题。 Iceberg CDC 的实现可以基于开源的 CDC 工具如 Debezium、Maxwell 等,也可以自行开发。通常需要考虑以下问题: 1. 数据库日志格式:不同的数据库使用不同的日志格式,需要了解数据库日志的格式和捕获方式。 2. 数据转换:需要将捕获的变更数据转换为目标系统可接受的格式。可以使用开源的 ETL 工具如 Apache NiFi、Apache Kafka Connect 等,也可以自行开发。 3. 数据传输:需要选择适合的数据传输方式,如消息队列、HTTP 接口等。 4. 数据一致性和完整性:需要确保数据的一致性和完整性,尤其是在多个目标系统中同步数据时。可以使用事务、幂等性等技术来保证数据的一致性和完整性。 总之,Iceberg CDC 是一种非常常见的数据同步方式,可以帮助组织实现数据的实时同步和集成。但是,实现 Iceberg CDC 需要考虑多种因素,包括数据库日志格式、数据转换、数据传输、数据一致性和完整性等,需要仔细设计和实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值