
1) 【一句话结论】采用“双流分离”架构,以Kafka作为统一数据总线,通过Kafka Connect适配多源数据(流/批),Flink负责低延迟实时计算(如实时风控、会话分析),Spark负责大规模离线分析(如报表、机器学习),数据湖存储采用Hudi/Iceberg实现时间分区与ACID事务,满足实时采集、实时计算及离线分析需求。
2) 【原理/概念讲解】
/hudi/active_user/current),离线分析读取历史分区(如/hudi/active_user/20240101),通过时间分区表实现数据隔离,避免实时计算影响离线分析,反之亦然。3) 【对比与适用场景】
| 模块 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 数据采集 | 集成多源数据,统一接入 | 高吞吐、协议适配、低延迟 | 日志、数据库、API等实时数据源 | 需配置Kafka Connect插件(如Debezium处理数据库变更) |
| 实时计算 | 低延迟流处理,状态计算 | 支持事件时间、Checkpoint | 实时风控、会话分析、实时推荐 | Checkpoint间隔需根据业务延迟容忍度设置(如1分钟) |
| 离线分析 | 大规模历史数据处理 | 支持复杂SQL、机器学习 | 报表生成、数据挖掘、模型训练 | Spark shuffle分区数需根据数据量调整(如1000-2000) |
| 技术选型对比 | Flink | Spark Streaming |
|---|---|---|
| 处理模型 | 流式处理(事件驱动) | 微批处理(周期性触发) |
| 容错机制 | 检查点(Checkpoint) | 状态快照(State Snapshots) |
| 适用场景 | 实时低延迟、状态计算 | 实时性要求不高,复杂SQL |
| 注意点 | 状态管理复杂,需优化RocksDB | 实时性不如Flink,但SQL支持强 |
(业务场景举例:实时风控需Flink低延迟状态计算,离线报表用Spark微批处理,避免实时计算影响离线分析。)
4) 【示例】
数据流示例:用户点击事件(ClickEvent)通过Kafka Connect从API端点(如用户点击接口)接入,进入Kafka主题(click-topic)。Flink消费该流,按用户ID分组,计算5分钟滑动窗口内的活跃用户数(ActiveUser),结果写入Hudi的当前分区(/hudi/active_user/current)。Spark读取Hudi的历史分区(如/ hudi/active_user/20240101),生成“每日活跃用户报表”。
伪代码(Flink):
// 1. 添加Kafka源(假设已通过Kafka Connect接入数据)
DataStream<ClickEvent> kafkaStream = env
.addSource(new FlinkKafkaConsumer<ClickEvent>("click-topic", new ClickEventDeserialization(), properties));
// 2. 窗口计算
DataStream<ActiveUser> activeUserStream = kafkaStream
.keyBy(ClickEvent::getUserId)
.window(TumblingEventTimeWindows.of(Time.minutes(5)))
.count()
.map(new ActiveUserMapper());
// 3. 写入Hudi(当前分区)
activeUserStream.addSink(new HudiSink("hdfs://namenode:9000/hudi/active_user/current"));
5) 【面试口播版答案】
“面试官您好,针对新凯来的大数据处理平台需求,我设计的架构是‘双流分离’模式。首先,数据采集层用Kafka作为统一总线,通过Kafka Connect集成多源数据(如日志、数据库变更、API),保证高吞吐和协议适配。实时计算层选Flink,处理实时数据流(如用户会话、风控规则),通过Checkpoint机制保证容错,计算结果写入Hudi的当前分区。离线分析层用Spark处理历史数据,生成报表或模型。数据存储用Hudi实现时间分区,实时与离线数据分离,避免冲突。具体来说,数据从Kafka进入Flink实时计算,写入Hudi当前分区,Spark读取历史分区做离线分析,这样既满足实时采集、计算,也支持离线分析,且通过时间分区保证数据一致性。”
6) 【追问清单】
/hudi/active_user/current),离线分析读取历史分区(如/hudi/active_user/20240101),避免数据冲突。7) 【常见坑/雷区】