Doris 整合 Iceberg+Flink CDC 构建实时湖仓一体的联邦查询分析架构

一、系统架构

  1. 首先我们从 Mysql 数据中使用 Flink CDC,通过 Binlog 完成数据的实时采集

  2. 然后在 Flink 中创建 Iceberg 表,Iceberg 的数据保存在 Hive 里

  3. 最后我们在 Doris 中创建 Iceberg 外表

  4. 再通过 Doris 统一查询入口完成对 Iceberg 里的数据查询分析,供前端应用调用,这里 Iceberg 外表的数据可以和 Doris 内部数据或者 Doris 其他外部数据源的数据进行关联查询分析

Doris 湖仓一体的联邦查询架构如下:

  1. Doris 通过 ODBC 方式支持:MySQL,Postgresql,Oracle ,SQLServer
  2. 同时支持 Elasticsearch 外表
  3. 1.0 版本支持 Hive 外表
  4. 1.1 版本支持 Iceberg 外表
  5. 1.2 版本支持 Hudi 外表

二、数据准备

1、Mysql数据准备

创建 MySql 数据库表并初始化数据

CREATE DATABASE demo;
USE demo;
CREATE TABLE userinfo (
  id int NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL DEFAULT 'flink',
  address VARCHAR(1024),
  phone_number VARCHAR(512),
  email VARCHAR(255),
  PRIMARY KEY (`id`)
)ENGINE=InnoDB ;
INSERT INTO userinfo VALUES (10001,'user_110','Shanghai','13347420870', NULL);
INSERT INTO userinfo VALUES (10002,'user_111','xian','13347420870', NULL);
INSERT INTO userinfo VALUES (10003,'user_112','beijing','13347420870', NULL);
INSERT INTO userinfo VALUES (10004,'user_113','shenzheng','13347420870', NULL);
INSERT INTO userinfo VALUES (10005,'user_114','hangzhou','13347420870', NULL);
INSERT INTO userinfo VALUES (10006,'user_115','guizhou','13347420870', NULL);
INSERT INTO userinfo VALUES (10007,'user_116','chengdu','13347420870', NULL);
INSERT INTO userinfo VALUES (10008,'user_117','guangzhou','13347420870', NULL);
INSERT INTO userinfo VALUES (10009,'user_118','xian','13347420870', NULL);

2、Flink准备

启动后的界面如下:

进入 Flink SQL Client

bin/sql-client.sh embedded

开启 Checkpoint,每隔 3 秒做一次 Checkpoint

Checkpoint 默认是不开启的,我们需要开启 Checkpoint 来让 Iceberg 可以提交事务。并且,MySql-CDC 在 Binlog 读取阶段开始前,需要等待一个完整的 Checkpoint 来避免 Binlog 记录乱序的问题。

注意:这里是演示环境,Checkpoint 的间隔设置比较短,线上使用,建议设置为3-5分钟一次 Checkpoint。

Flink SQL> SET execution.checkpointing.interval = 3s;

创建 Iceberg Catalog
CREATE CATALOG hive_catalog WITH (
 'type'='iceberg',
 'catalog-type'='hive',
 'uri'='thrift://localhost:9083',
 'clients'='5',
 'property-version'='1',
 'warehouse'='hdfs://localhost:8020/user/hive/warehouse'
);

Flink SQL> show catalogs;
+-----------------+
|   catalog name |
+-----------------+
| default_catalog |
|   hive_catalog |
+-----------------+
2 rows in set
  创建 MySql CDC 表
CREATE TABLE user_source (
  database_name STRING METADATA VIRTUAL,
   table_name STRING METADATA VIRTUAL,
   `id` DECIMAL(20, 0) NOT NULL,
  name STRING,
  address STRING,
  phone_number STRING,
  email STRING,
   PRIMARY KEY (`id`) NOT ENFORCED
 ) WITH (
   'connector' = 'mysql-cdc',
   'hostname' = 'localhost',
   'port' = '3306',
   'username' = 'root',
   'password' = 'MyNewPass4!',
   'database-name' = 'demo',
   'table-name' = 'userinfo'
 );
 创建 Iceberg 表
---查看catalog
show catalogs;
---使用catalog
use catalog hive_catalog;
--创建数据库
CREATE DATABASE iceberg_hive;
--使用数据库
use iceberg_hive;

CREATE TABLE all_users_info (
  database_name STRING,
  table_name   STRING,
  `id`         DECIMAL(20, 0) NOT NULL,
  name         STRING,
  address       STRING,
  phone_number STRING,
  email         STRING,
  PRIMARY KEY (database_name, table_name, `id`) NOT ENFORCED
) WITH (
  'catalog-type'='hive'
);

开发逻辑:从 CDC 表里插入数据到 Iceberg 表里

use catalog default_catalog;

insert into hive_catalog.iceberg_hive.all_users_info select * from user_source;

 

去查询 Iceberg 表

select * from hive_catalog.iceberg_hive.all_users_info

 去 HDFS 上可以看到 Hive 目录下的数据及对应的元数据:

也可以通过Hive建好Iceberg表,然后通过Flink将数据插入到表里

在 Hive Shell 下执行:

SET engine.hive.enabled=true;
SET iceberg.engine.hive.enabled=true;
SET iceberg.mr.catalog=hive;
add jar /path/to/iiceberg-hive-runtime-0.13.2.jar;

创建表

CREATE EXTERNAL TABLE iceberg_hive(
 `id` int,
 `name` string)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION 'hdfs://localhost:8020/user/hive/warehouse/iceber_db/iceberg_hive'
TBLPROPERTIES (
 'iceberg.mr.catalog'='hadoop',
'iceberg.mr.catalog.hadoop.warehouse.location'='hdfs://localhost:8020/user/hive/warehouse/iceber_db/iceberg_hive'
 );

然后在 Flink SQL Client 下执行下面语句将数据插入到 Iceber 表里

INSERT INTO hive_catalog.iceberg_hive.iceberg_hive values(2, 'c');
INSERT INTO hive_catalog.iceberg_hive.iceberg_hive values(3, 'zhangfeng');');

查询这个表

select * from hive_catalog.iceberg_hive.iceberg_hive

 

三、Doris 查询 Iceberg

建 Iceberg 外表
CREATE TABLE `all_users_info`
ENGINE = ICEBERG
PROPERTIES (
"iceberg.database" = "iceberg_hive",
"iceberg.table" = "all_users_info",
"iceberg.hive.metastore.uris" = "thrift://localhost:9083",
"iceberg.catalog.type" = "HIVE_CATALOG"
);

参数说明:

ENGINE 需要指定为 ICEBERG

PROPERTIES 属性:

  • iceberg.hive.metastore.uris:Hive Metastore 服务地址
  • iceberg.database:挂载 Iceberg 对应的数据库名
  • iceberg.table:挂载 Iceberg 对应的表名,挂载 Iceberg database 时无需指定。
  • iceberg.catalog.type:Iceberg 中使用的 Catalog 方式,默认为 HIVE_CATALOG,当前仅支持该方式,后续会支持更多的 Iceberg catalog 接入方式。
select * from all_users_info;
+---------------+------------+-------+----------+-----------+--------------+-------+
| database_name | table_name | id    | name     | address   | phone_number | email |
+---------------+------------+-------+----------+-----------+--------------+-------+
| demo          | userinfo   | 10004 | user_113 | shenzheng | 13347420870  | NULL  |
| demo          | userinfo   | 10005 | user_114 | hangzhou  | 13347420870  | NULL  |
| demo          | userinfo   | 10002 | user_111 | xian      | 13347420870  | NULL  |
| demo          | userinfo   | 10003 | user_112 | beijing   | 13347420870  | NULL  |
| demo          | userinfo   | 10001 | user_110 | Shanghai  | 13347420870  | NULL  |
| demo          | userinfo   | 10008 | user_117 | guangzhou | 13347420870  | NULL  |
| demo          | userinfo   | 10009 | user_118 | xian      | 13347420870  | NULL  |
| demo          | userinfo   | 10006 | user_115 | guizhou   | 13347420870  | NULL  |
| demo          | userinfo   | 10007 | user_116 | chengdu   | 13347420870  | NULL  |
+---------------+------------+-------+----------+-----------+--------------+-------+
9 rows in set (0.18 sec)
Doris同步挂在 Iceberg 表 Schema 变更不会自动同步,需要在 Doris 中通过 REFRESH 命令同步 Iceberg 外表或数据库。

当 Iceberg 表 Schema 发生变更时,可以通过 REFRESH 命令手动同步,该命令会将 Doris 中的 Iceberg 外表删除重建。

-- 同步 Iceberg 表
REFRESH TABLE t_iceberg;
​
-- 同步 Iceberg 数据库
REFRESH DATABASE iceberg_test_db;
Doris 和 Iceberg 数据类型对应关系

支持的 Iceberg 列类型与 Doris 对应关系如下表:

IcebergDoris描述
BOOLEANBOOLEAN
INTEGERINT
LONGBIGINT
FLOATFLOAT
DOUBLEDOUBLE
DATEDATE
TIMESTAMPDATETIMETimestamp 转成 Datetime 会损失精度
STRINGSTRING
UUIDVARCHAR使用 VARCHAR 来代替
DECIMALDECIMAL
TIME-不支持
FIXED-不支持
BINARY-不支持
STRUCT-不支持
LIST-不支持
MAP-不支持

 

四、总结

        这里Doris On Iceberg我们只演示了Iceberg单表的查询,你还可以联合Doris的表,或者其他的ODBC外表,Hive外表,ES外表等进行联合查询分析,通过Doris对外提供统一的查询分析入口。

自此我们完整从搭建Hadoop,hive、flink 、Mysql、Doris 及Doris On Iceberg的使用全部介绍完了,Doris朝着数据仓库和数据融合的架构演进,支持湖仓一体的联邦查询,给我们的开发带来更多的便利,更高效的开发,省去了很多数据同步的繁琐工作,快快来体验吧。

<think>好的,我现在需要回答用户关于搭建实时所需技术和架构的问题。首先,我得回忆一下实时的基本概念,以及它与传统数的区别。实时的核心在于实时数据处理和分析,所以需要支持低延迟的技术组件。 接下来,我应该考虑实时架构。常见的架构有Lambda和Kappa,但现在可能还有其他变种,比如实时常用的分层结构,比如数据采集层、数据处理层、存储层、服务层等。需要把这些层次分清楚,并对应到具体的技术。 然后,技术选型是关键。数据采集方面,常用的有Kafka、Flume、Flink Connectors等。数据处理可能需要流处理框架,比如Flink、Spark Streaming,或者Kafka Streams。存储层的话,实时可能需要OLAP数据库,比如ClickHouse、Doris,或者HBase、Hudi、Iceberg等。服务层可能涉及API网关、查询引擎如Presto或Druid。 另外,需要考虑数据建模,比如维度建模是否适用,或者是否需要其他模型来支持实时查询。数据治理方面,元数据管理、数据质量监控、血缘追踪等也是重要部分,可能需要工具如Apache Atlas。 还要提到架构设计的关键点,比如低延迟、高可用、可扩展性、一致性等。可能需要解释Lambda和Kappa架构的区别,以及为什么现在更多转向Kappa或者更简化的架构。 可能用户会关心具体的技术组合,比如Flink + Kafka + ClickHouse这样的组合是否可行,或者结合Hudi做一体。需要给出一个典型的技术栈例子,帮助用户理解。 同时,需要注意实时的挑战,比如处理乱序数据、状态管理、Exactly-Once语义等,这些可能涉及技术组件的选择,比如Flink的优势在这里。 最后,确保回答结构清晰,分点列出技术和架构部分,可能用分层的方式解释,每层对应技术和作用。还要注意用户可能需要实际案例或应用场景,但用户没有具体问,所以点到为止即可。 总结步骤:先介绍实时的概念,然后分架构和技术两部分详细说明,每部分再细分层次和对应的技术组件,最后总结关键点和可能的技术组合示例。</think>### 实时技术架构详解 #### 一、核心架构分层 实时通常采用 **分层架构** 以解耦处理流程,典型分层如下: 1. **数据采集层** - **作用**:实时采集多源数据(日志、数据库变更、IoT设备等)。 - **技术选型**: - **消息队列**:Apache Kafka(高吞吐、低延迟)、Pulsar(分层存储)。 - **日志采集**:Filebeat、Flume。 - **数据库同步**:Debezium(CDC工具)、Canal。 2. **数据处理层** - **核心能力**:流批一体处理、实时ETL、数据清洗。 - **技术选型**: - **流处理引擎**:Apache Flink(主导地位,支持精确一次语义、状态管理)。 - **轻量级处理**:Kafka Streams(适合简单ETL)。 - **混合处理**:Spark Structured Streaming(微批模式)。 3. **存储层** - **设计要点**:需同时支持 **高并发写入** 与 **低延迟查询**。 - **技术组合**: - **实时写入**:Apache Hudi/Iceberg(事务型数据)。 - **OLAP引擎**:ClickHouse(列式存储)、Doris(MPP架构)、StarRocks。 - **宽表服务**:HBase(随机读写)、Redis(热数据缓存)。 4. **服务层** - **关键功能**:提供统一查询接口、数据可视化、实时BI。 - **技术栈**: - **查询引擎**:Presto(联邦查询)、Doris SQL。 - **API服务**:GraphQL(灵活数据聚合)、RESTful API。 - **可视化**:Grafana(实时仪表盘)、Superset。 #### 二、典型架构模式 1. **Lambda架构**(逐渐被替代) - **组成**: - 批处理层(HDFS+Hive) - 速度层(Flink/Kafka) - 服务层(合并结果) - **痛点**:维护两套代码、数据一致性难保障 2. **Kappa架构** - **革新点**:仅保留流处理层,通过 **数据重放** 实现批处理需求 - **实现路径**: $$ \text{Kafka(持久化日志)} \xrightarrow{Flink} \text{OLAP存储} $$ - **优势**:架构简化,适合事件驱动型场景 3. **一体架构**(新兴趋势) - **核心思想**:将数据与数能力融合 - **技术栈**: $$ \text{Delta Lake/Hudi} \leftarrow \xrightarrow{Flink} \rightarrow \text{Doris/StarRocks} $$ - **特征**:支持ACID事务、Schema演进、版本回溯 #### 三、关键技术组件详解 1. **Apache Flink** - **核心优势**: - 精确一次语义(通过Checkpoint机制) - 事件时间处理(解决乱序问题) - 状态管理($State TTL$自动清理) - **典型应用**: ```sql CREATE TABLE user_clicks ( user_id STRING, click_time TIMESTAMP(3), WATERMARK FOR click_time AS click_time - INTERVAL '5' SECOND ) WITH (...); SELECT TUMBLE_START(click_time, INTERVAL '1' HOUR), COUNT(DISTINCT user_id) FROM user_clicks GROUP BY TUMBLE(click_time, INTERVAL '1' HOUR); ``` 2. **实时存储选型对比** | 存储系统 | 写入吞吐 | 查询延迟 | 数据更新能力 | 适用场景 | |------------|----------|----------|--------------------|------------------------| | ClickHouse | 高 | 亚秒级 | 仅追加 | 大宽表聚合查询 | | HBase | 极高 | 毫秒级 | 支持随机更新 | 点查、时序数据 | | Doris | 中高 | 秒级 | 支持批量更新 | Ad-hoc查询 | | Hudi | 中 | 分钟级 | 支持增量更新 | 近实时数据 | 3. **数据质量保障** - **端到端延迟监控**:Prometheus + Grafana监控pipeline延迟 - **Exactly-Once实现**: $$ \text{Kafka(幂等生产)} + \text{Flink(两阶段提交)} $$ - **数据一致性校验**:通过DWD层的唯一键校验(如$HASH(user_id,event_time)$) #### 四、实施路线建议 1. **场景驱动设计** - 广告实时投放:要求百毫秒级响应 → 选择Flink + Redis - 实时风控:复杂规则计算 → Flink CEP + HBase - 运营大盘:分钟级延迟可接受 → Flink + Hudi + Presto 2. **迭代优化路径** ```mermaid graph TD A[Kafka做原始日志收集] --> B[Flink ETL清洗] B --> C[写入Hudi数据] C --> D[Doris构建聚合层] D --> E[BI工具可视化] ``` 3. **常见陷阱规避** - **热点问题**:采用$user_id\%100$分桶避免数据倾斜 - **小文件问题**:Hudi的Clustering优化 - **资源隔离**:Flink生产消费组独立部署 #### 五、前沿发展方向 1. **流批一体存储**:Apache Paimon(原Flink Table Store) 2. **智能实时**:集成ML模型进行实时预测 3. **Serverless化**:基于Kubernetes的弹性扩缩容 **总结**:实时建设需以业务场景为锚点,通过Flink+消息队列+OLAP存储构建核心链路,同时结合数据技术实现灵活性与效率的平衡。技术选型时需重点评估数据更新频率、查询复杂度、一致性要求等维度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四月天03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值