如何基于 Apache SeaTunnel 同步数据到 Iceberg

概述

Apache SeaTunnel

Apache SeaTunnel 是一个分布式、高性能、易扩展、用于海量数据(离线&实时)同步和转化的开源数据集成平台, 支持spark、flink 及自研 Zeta 引擎,有庞大的用户社群.

Apache Iceberg

Apache Iceberg 是一个开源的表格格式,它旨在改善大数据生态系统中复杂的数据湖管理。作为Apache软件基金会的一部分,Iceberg专为提供更强大、更灵活的数据湖表格管理功能而设计,它通过提供一种更加高效和可靠的方式来处理大规模数据集,从而解决了传统数据湖在数据可靠性、性能和可维护性方面的挑战。

主要特点
  1. 模式演变和兼容性:Iceberg支持模式的演变,同时保证了向前和向后的兼容性。这使得在不破坏已有数据的情况下添加、删除、更新字段成为可能。
  2. 隐藏分区:分区信息作为表模式的一部分进行存储,这消除了需要手动管理分区目录的复杂性。分区对查询透明,即可进行常规查询而无需指定具体的分区。
  3. 多计算引擎支持:Iceberg可以与现代计算引擎无缝集成,包括Apache Spark、Apache Flink、PrestoDB 和 Trino等。同一数据集可以被多个引擎并发访问且保持一致性。
  4. 存储引擎支持: HDFS / S3
  5. 原子操作:Iceberg支持原子性写入操作。这意味着表更新要么全部成功,要么全部失败,确保了数据的一致性。
  6. 快照管理:支持表的快照功能,允许用户回滚到历史版本,以及进行增量读取操作。这对于数据恢复和审计尤为重要。
  7. 高效读写:通过提供文件层面的元数据,使得读写操作可以更高效地进行。该功能减少了需要扫描的数据量,改善了查询性能。
使用场景
  • 数据湖构建和管理:对于需要构建和管理大型数据湖的企业和组织,Apache Iceberg提供了一个高效、可扩展且易于管理的解决方案。
  • 多计算引擎环境:在使用多个计算引擎进行数据处理的环境中,Iceberg能够提供一致的数据视图和并发控制。
  • 数据科学和分析:提供了更强大且灵活的数据组织方式,使得进行复杂分析和数据科学项目更加容易。

SeaTunnel Iceberg sink

介绍

Apache SeaTunnel connector-Iceberg 是专门为Iceberg引擎开发的数据同步组件, 主要为了方便SeaTunnel 用户能更加友好的使用Iceberg来构建企业级数据湖仓

Iceberg sink 特性

  • 支持数据批量数据写入
  • cdc模式下的数据同步
  • 支持配置自动建表
  • 支持schema evolution
  • 支持指定分区键
  • 支持数据提交到指定的branch

Sink参数配置

Name Type Required Default Description
catalog_name string yes default 用户指定的目录名称。默认为 default。
namespace string yes default Iceberg 数据库名称。默认为 default
table string yes - Iceberg 表名称。
iceberg.catalog.config map no - 指定用于初始化 Iceberg 目录的属性,具体配置参考:Iceberg Catalog Properties
hadoop.config map no - 指定 Hadoop 配置的属性,具体配置参考: Hadoop Configuration
iceberg.hadoop-conf-path string no - 指定加载 'core-site.xml'、'hdfs-site.xml'、'hive-site.xml' 文件的路径。
case_sensitive boolean no false 控制是否以区分大小写的方式匹配 schema。
iceberg.table.write-props map no - 传递给 Iceberg 写入器初始化的属性,这些属性具有优先权,可以在 Iceberg Write Properties 找到具体参数。
iceberg.table.auto-create-props map no - Iceberg 在自动创建表时指定的配置, 具体参照: Table Behavior Properties
iceberg.table.schema-evolution-enabled boolean no false 将其设置为 true 可以使 Iceberg 表在同步过程中支持模式演变。目前仅支持添加字段 和 部分类型变更
iceberg.table.primary-keys string no - 表的主键配置,多个主键用","分割 ,与 "iceberg.table.upsert-mode-enabled" 一起使用,用于同主键数据的增量更新
iceberg.table.upsert-mode-enabled boolean no false 将其设置为 true 以启用 upsert 模式,默认为 false, 用于 Iceberg 中数据的增量更新
iceberg.table.partition-keys string no - 创建表时指定的分区字段,多个分区字段使用","分隔。
iceberg.table.commit-branch string no - 指定数据提交的分支

同步模式

批处理

  • 批模式数据导入, append模式 ,不进行数据的增量更新

  • 支持 flink , spark ,zeta 引擎

    env {
    parallelism = 1
    job.mode = "BATCH"

    复制代码
    # You can set spark configuration here
    spark.app.name = "SeaTunnel"
    spark.executor.instances = 2
    spark.executor.cores = 1
    spark.executor.memory = "1g"
    spark.master = local

    }

    source {
    FakeSource {
    row.num = 100
    schema = {
    fields {
    c_map = "map<string, string>"
    c_array = "array<int>"
    c_string = string
    c_boolean = boolean
    c_tinyint = tinyint
    c_smallint = smallint
    c_int = int
    c_bigint = bigint
    c_float = float
    c_double = double
    c_decimal = "decimal(30, 8)"
    c_bytes = bytes
    c_date = date
    c_timestamp = timestamp
    }
    }
    result_table_name = "fake"
    }
    }

    transform {
    }

    sink {
    Iceberg {
    catalog_name="seatunnel_test"
    iceberg.catalog.config={
    "type"="hadoop"
    "warehouse"="file:///tmp/seatunnel/iceberg/hadoop-sink/"
    }
    namespace="seatunnel_namespace"
    table="iceberg_sink_table"
    iceberg.table.write-props={
    write.format.default="parquet"
    write.target-file-size-bytes=10
    }
    iceberg.table.partition-keys="c_timestamp"
    case_sensitive=true
    }
    }

流写入(CDC)

  • 配置mysql cdc 进行数据的增量采集

  • Sink 指定 iceberg.table.primary-keys 和 iceberg.table.upsert-mode-enabled=true 进行数据增量写入

  • 配置 iceberg.table.schema-evolution-enabled=true 支持 schema 的演进(当前仅支持增加字段和部分类型变更)

  • 支持 flink / zeta 引擎的数据同步,不支持 spark

    复制代码
    env {
    parallelism = 1
    job.mode = "STREAMING"
    checkpoint.interval = 5000
    }

source { MySQL-CDC { result_table_name="customer_result_table" catalog { factory = Mysql } debezium = { # include ddl "include.schema.changes" = true } database-names=["mysql_cdc"] table-names = ["mysql_cdc.mysql_cdc_e2e_source_table"] format=DEFAULT username = "st_user" password = "seatunnel" base-url = "jdbc:mysql://mysql_cdc_e2e:3306/mysql_cdc" } }

transform { }

sink { Iceberg { catalog_name="seatunnel_test" iceberg.catalog.config={ "type"="hadoop" "warehouse"="file:///tmp/seatunnel/iceberg/hadoop-cdc-sink/" } namespace="seatunnel_namespace" table="iceberg_sink_table" iceberg.table.write-props={ write.format.default="parquet" write.target-file-size-bytes=10 } iceberg.table.primary-keys="id" iceberg.table.partition-keys="f_datetime" iceberg.table.upsert-mode-enabled=true iceberg.table.schema-evolution-enabled=true case_sensitive=true } }

```

总结

基于Apache SeaTunnel来构建数据湖项目, 我们可以直接引用 SeaTunnel 强大的组件生态,不用独立构造新的项目来实现业务需求,同时Apache SeaTunnel的标准的架构设计也为熟悉开源的朋友提供了快速独立扩展的机会,可以在此基础上快速扩展自己的需求,做出符合自己业务需要的组件, 也欢迎大家试用 Iceberg-connect , 希望能帮大家真正解决实际生产场景中遇到的问题,

也希望大家能积极反馈使用中的问题,并贡献场景,大家共同来解决,并促进 Iceberg-connect 组件的完善, 一起共创数据开发的新场景.

本文由 白鲸开源科技 提供发布支持!

相关推荐
TDengine (老段)8 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)8 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
字节数据平台9 小时前
火山引擎Data Agent再拓新场景,重磅推出用户研究Agent
大数据·人工智能·火山引擎
铭毅天下12 小时前
Elasticsearch 到 Easysearch 数据迁移 5 种方案选型实战总结
大数据·elasticsearch·搜索引擎·全文检索
跨境小新12 小时前
Facebook广告投放:地域定向流量不精准?x个优化指南
大数据·facebook
ZKNOW甄知科技13 小时前
客户案例 | 派克新材x甄知科技,构建全场景智能IT运维体系
大数据·运维·人工智能·科技·低代码·微服务·制造
币须赢13 小时前
688758赛分科技 阴上阴形态 洗盘上涨?
大数据
学掌门13 小时前
大数据知识合集之预处理方法
大数据
Elastic 中国社区官方博客15 小时前
Elasticsearch 推理 API 增加了开放的可定制服务
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
蒙特卡洛的随机游走15 小时前
Spark核心数据(RDD、DataFrame 和 Dataset)
大数据·分布式·spark