
1) 【一句话结论】
采用“数据预处理-消息队列-流处理引擎-结果存储”分层架构,以Flink为核心流处理框架,通过Kafka事务日志与Flink检查点协同实现Exactly-once语义,结合水平扩展策略保证系统可扩展性,同时处理数据清洗、格式转换等预处理步骤,满足高频数据实时分析需求。
2) 【原理/概念讲解】
老师口吻解释各组件作用:
3) 【对比与适用场景】
| 组件 | Flink | Spark Streaming | 使用场景 | 注意点 |
|---|---|---|---|---|
| 定义 | 基于事件时间的流处理框架,支持Exactly-once语义 | 基于微批处理的流处理,延迟较高 | 实时性要求高(如智慧城市交通拥堵指数,需毫秒级延迟)、需要精确计算 | Flink适合低延迟、高实时性场景;Spark Streaming适合数据量极大、对延迟要求不高的场景 |
| 特性 | 低延迟(毫秒级)、状态管理高效、Exactly-once | 高吞吐、批处理语义、窗口计算可能产生数据倾斜 | 实时性要求高(如毫秒级延迟)、状态管理复杂 | Flink需合理配置事件时间与水印;Spark Streaming需优化窗口计算避免倾斜 |
| 数据一致性 | Exactly-once(事务日志+检查点) | At-least-once(默认) | 需要精确计算的场景(如金融交易、智慧城市指标) | Flink需配置事务日志和检查点;Spark Streaming需额外实现幂等消费 |
4) 【示例】
伪代码处理交通数据,包含预处理和窗口计算:
from pyflink.table import *
from pyflink.table.window import Tumble
# 1. 数据预处理(过滤无效数据,转换时间格式)
table_env = TableEnvironment.create()
table_env.connect(
Kafka()
.topic("traffic_raw")
.start_from_latest()
.property("bootstrap.servers", "kafka:9092")
.property("group.id", "traffic_preprocess")
.property("partition.key", "location")
).create_temporary_table("traffic_raw")
# 过滤无效数据并写入预处理表
table_env.execute_sql("""
CREATE TABLE traffic_clean (
vehicle_id BIGINT,
location STRING,
speed DOUBLE,
ts TIMESTAMP(3)
) WITH (
'connector' = 'kafka',
'topic' = 'traffic_raw',
'properties.bootstrap.servers' = 'kafka:9092',
'properties.group.id' = 'traffic_preprocess',
'format' = 'json'
)
""")
table_env.execute_sql("""
SELECT
vehicle_id,
location,
speed,
ts
FROM
traffic_raw
WHERE
speed > 0 AND speed < 200 -- 过滤无效速度
INSERT INTO TABLE traffic_clean
""")
# 2. 流处理(计算拥堵指数)
table_env.connect(
Kafka()
.topic("traffic_clean")
.start_from_latest()
.property("bootstrap.servers", "kafka:9092")
.property("group.id", "traffic_analyzer")
.property("partition.key", "location") # 按区域分区
).create_temporary_table("traffic_clean")
table_env.execute_sql("""
SELECT
location,
AVG(speed) AS avg_speed,
COUNT(vehicle_id) AS vehicle_count,
CASE
WHEN AVG(speed) < 20 THEN '严重拥堵'
WHEN AVG(speed) < 40 THEN '中度拥堵'
ELSE '畅通'
END AS congestion_level
FROM
traffic_clean
TUMBLE (window_size '5 minute', window_slide '1 minute')
GROUP BY
location, congestion_level
INSERT INTO TABLE result_store -- 结果存储(如Redis)
""")
解释:传感器原始数据先经过预处理(过滤无效速度、转换时间戳),再写入Kafka;Flink按区域分区,减少数据倾斜;5分钟滑动窗口计算区域平均速度和车辆数,生成拥堵等级,结果写入Redis供前端实时展示。
5) 【面试口播版答案】
(约90秒)
“面试官您好,针对智慧城市大数据分析平台,我设计的架构核心是分层处理,从数据预处理到实时计算,每个环节都考虑工程细节。首先,传感器原始数据会先经过预处理,比如过滤无效值(如速度为负)和异常值(如PM2.5超出范围),再统一时间格式,确保数据准确。然后,用Kafka作为消息队列,处理每秒数万条数据,通过分区扩容提升吞吐。流处理层选用Flink,因为它支持Exactly-once语义,通过Kafka事务日志和Flink检查点协同,保证数据不丢失也不重复处理。比如计算交通拥堵指数时,用5分钟滑动窗口聚合车辆数和速度,生成拥堵等级。结果存储在Redis,供前端实时展示。为了保证系统可扩展,Kafka增加分区数,Flink调整任务并行度,存储用Redis Cluster扩容。数据倾斜方面,按区域(时间+区域)自定义分区键,减少分区内数据不均。这样整个架构能高效处理高频数据,实时生成分析结果,同时保证数据一致性和可扩展性。”
6) 【追问清单】
7) 【常见坑/雷区】