数据湖| Iceberg
1. Iceberg构建数据湖
核心思想
在时间轴上跟踪表的所有变化;
- 快照表示表数据文件的一个完整集合;
- 每次更新操作会生成一个新的快照;
特性
① 优化数据入库流程
- Iceberg提供ACID事务能力,上游数据写入即可见,不影响当前数据处理任务,这大大简化了ETL;
- Iceberg提供upsert/merge into能力,可以极大地缩小数据入库延迟;
② 支持更多的分析引擎
- 优秀的内核抽象使之不绑定特定引擎,目前在支持的有spark、flink、presto、hive;
- Iceberg提供了java native API,不用特定引擎也可以访问Iceberg表;
③ 统一数据存储和灵活的文件组织
- 提供了基于流式的增量计算模型和基于批处理的全量表计算模型,批任务和流任务可以使用相同 的存储模型(HDFS、OZONE),数据不再孤立;
- Iceberg支持隐藏分区和分区进化,方便业务进行数据分区策略更新;
- 支持Parquet、ORC、Avro行列存兼顾;
④ 增量读取处理能力
- Iceberg支持通过流式方式读取增量数据;
- Spark struct streaming支持;
- Flink table source支持;
文件发布
Apache Iceberg的实现细节
快照设计方式
快照隔离
• 读操作仅适用当前已生成快照
• 写操作会生成新的隔离快照,并在写完成后原子性提交 l
对于文件列表的所有修改都是原子操作
• 在分区中追加数据
• 合并或是重写分区
元数据组织形式
实现基于快照的跟踪方式;
• 记录表的结构,分区信息,参数等
• 跟踪老的快照以确保能够最终回收
表的元数据是不可修改的, 并且始终向前迭代;
当前的快照可以回退;
事务性提交
写操作必须
• 记录当前元数据的版本--base version
• 创建新的元数据以及manifest文件
• 原子性的将base version 替换为新的版本
原子性替换保证了线性的历史
原子性替换需要依靠以下操作来保证
冲突解决--乐观锁
• 假定当前没有其他的写操作
• 遇到冲突则基于当前最新的元数据进行重试
• 元数据管理器所提供的能力
• HDFS或是本地文件系统所提供的原子化的rename能力
2. IceBerg结合Flink的应用场景
场景① 构建近实时Data Pipeline
IceBerg提供了增量拉取的能力,类似Huidi增量查询的方式;IceBerg可以做到分钟级别;
场景② CDC数据实时摄入摄出
FlinkCDC增量数据写入IceBerg
场景③ 近实时场景的流批统一
原有的架构为lambda架构,分为离线链路和 实时链路;
场景④ 从Iceberg历史数据启动Flink任务
场景⑤ 通过Iceberg数据来订正实时聚合结果
3. Apache Flink如何集成Apache Iceberg
如何对齐Flink和Iceberg的Schema ;
Flink SQL、Flink Table API、Iceberg API,它们之间类型互相对比映射,Iceberg屏蔽了跟底下文件交互的细节,只需考虑上层即可。
Flink 记录如何写入 Iceberg 表的 AVRO 文件 ?
实现表级别的语义,Flink中每个字段都给它设计成了一个writer的样式,ID Int -> IntWriter... 形成 一颗树形结构,再遍历写入iceberg;
如何设计 Iceberg Sink 的 Operator ?
如何设计flink中的算子才能sink到iceberg中,并且实现exactly-once语义、容错机制(checkpoint、state)等功能;
每个并发写入为一个IcebergStreamWriter,写到了两个partition,但是还没commit提交,这时可以设计一个IcebergFilesCommitter(单并发节点来进行提交,如果有多个commit提交会有冲突),统一提交给Iceberg;
Flink算子的State,保存数据的状态(就可以实现复杂的业务逻辑),spark中没有状态,但特殊算子如updateStateBykey才会有状态;
如何设计 Operator 的 State ?
如何在failover的时候保证 exactly-once 语义?
如果中途某次checkpoint失败,其他checkpoint都正常。 如何设计来保证数据不丢且语义正确?
两个算子 IcebergStreamWriter不给state为空(因为它会把写成功 的数据文件传给FileCommitter), IceberFileCommitter有state 它做checkpoint时,保存到flink中的stateBackend中,再提交到Iceberg中的表中;
StateBackend是flink中存储state的方式,checkpoint也会存储到StateBackend中;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2020-09-26 算法 09| 多模式匹配算法| AC自动机