汽车之家:基于Flink+Iceberg的湖仓一体架构实践.docx

汽车之家:基于Flink+Iceberg的湖仓一体架构实践.docx

汽车之家:基于Flink+Iceberg的湖仓一体架构实践 1. 基于 Hive 的数据仓库的痛点 原有的数据仓库完全基于 Hive 建筑而成,次要存在三大痛点: 痛点一:不支持 ACID 1)不支持 Upsert 场景; 2)不支持 Row-level delete,数据修正成本高。 痛点二:时效性难以提升 1)数据难以做到准实时可见; 2)无法增量读取,无法实现存储层面的流批统一; 3)无法支持分钟级延迟的数据分析场景。 痛点三:Table Evolution 1)写入型 Schema,对 Schema 变更支持不好; 2)Partition Spec 变更支持不友好。 2. Iceberg 关键特性 Iceberg 次要有四大关键特性:支持 ACID 语义、增量快照机制、开放的表格式和流批接口支持。 支持 ACID 语义 不会读到不完整的 Commit; 基于乐观锁支持并发 Commit; Row-level delete,支持 Upsert。 增量快照机制 Commit 后数据即可见(分钟级); 可回溯历史快照。 开放的表格式 数据格式:parquet、orc、avro 计算引擎:Spark、Flink、Hive、Trino/Presto 流批接口支持 支持流、批写入; 支持流、批读取。 二、基于 Iceberg 的湖仓一体架构实践 湖仓一体的意义就是说我不需要观察湖和仓,数据有着打通的元数据的格式,它可以自在的流淌,也可以对接上层多样化的计算生态。 ——贾扬清(阿里云计算平台高级争辩员) 1. Append 流入湖的链路 上图为日志类数据入湖的链路,日志类数据包含客户端日志、用户端日志以及服务端日志。这些日志数据会实时录入到 Kafka,然后通过 Flink 任务写到 Iceberg 里面,最终存储到 HDFS。 2. Flink SQL 入湖链路打通 我们的 Flink SQL 入湖链路打通是基于 “Flink 1.11 + Iceberg 0.11” 完成的,对接 Iceberg Catalog 我们次要做了以下内容: 1)Meta Server 添加对 Iceberg Catalog 的支持; 2)SQL SDK 添加 Iceberg Catalog 支持。 然后在这基础上,平台开放 Iceberg 表的管理功能,使得用户可以本人在平台上建 SQL 的表。 3. 入湖 - 支持代理用户 其次步是内部的实践,对接现有预算体系、权限体系。 由于之前平台做实时作业的时候,平台都是默认为 Flink 用户去运转的,之前存储不涉及 HDFS 存储,因而可能没有什么问题,也就没有思考预算划分方面的问题。 但是现在写 Iceberg 的话,可能就会涉及一些问题。比如数仓团队有本人的集市,数据就应当写到他们的名目下面,预算也是划到他们的预算下,同时权限和离线团队账号的体系打通。 如上所示,这块次要是在平台上做了代理用户的功能,用户可以去指定用哪个账号去把这个数据写到 Iceberg 里面,实现过程次要有以下三个。 添加 Table 级别配置:xy = targetUser’ 1)启用 Superuser 2)团队账号鉴权 访问 HDFS 时启用代理用户: 访问 Hive Metastore 时指定代理用户 1)参考 Spark 的相关实现: org.apache.spark.deploy.security.HiveDelegationTokenProvider 2)动态代理 HiveMetaStoreClient,使用代理用户访问 Hive metastore 4. Flink SQL 入湖示例 DDL + DML 5. CDC 数据入湖链路 如上所示,我们有一个 AutoDTS 平台,担任业务库数据的实时接入。我们会把这些业务库的数据接入到 Kafka 里面,同时它还支持在平台上配置分发任务,相当于把进 Kafka 的数据分发到不同的存储引擎里,在这个场景下是分发到 Iceberg 里。 6. Flink SQL CDC 入湖链路打通 下面是我们基于 “Flink1.11 + Iceberg 0.11” 支持 CDC 入湖所做的改动: 改进 Iceberg Sink: Flink 1.11 版本为 AppendStreamTableSink,无法处理 CDC 流,修改并适配。 表管理 1)支持 Primary key(PR1978) 2)开启 V2 版本:iceberg.format.version = 2 7. CDC 数据入湖 ■ 1. 支持 Bucket Upsert 场景下,需要确保同一条数据写入到同一 Bucket 下,这又如何实现? 目前 Flink SQL 语法不支持声明 bucket 分区,通过配置的方式声明

文档评论(0)

1亿VIP精品文档

相关文档