
1) 【一句话结论】:采用分层解耦架构,结合消息队列(如Kafka)解耦采集与处理,用流处理引擎(如Flink)保障实时计算,通过湖仓一体存储,确保数据实时性(如交通流量秒级更新)和高可用性。
2) 【原理/概念讲解】:城市大脑需整合多源异构数据(交通、公安等),数据采集端(传感器、API)数据格式、协议、更新频率差异大(如交通秒级更新,公安分钟级),传统ETL难以满足实时性。需用消息队列解耦:采集端将数据推送到队列,处理端消费并处理,避免直接耦合;用流处理引擎(如Flink)支持事件时间、状态管理,实现实时计算(如窗口统计、异常检测),保证数据不丢失且计算准确;存储层采用湖仓一体(如HDFS+Hive),支持实时查询与批处理,满足不同场景需求。类比:数据采集像多个水源(交通、公安)汇入水库(Kafka),流处理像水库中的实时净化系统(Flink),处理后的水流入数据湖(Hive),供下游分析。
3) 【对比与适用场景】:
| 技术选型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Kafka | 分布式消息队列 | 高吞吐(百万级QPS)、低延迟(毫秒级)、持久化(消息不丢失)、高可用(副本机制) | 实时数据中转,解耦数据采集与处理,缓冲数据波动 | 需要磁盘存储,消息积压可能导致延迟增加;需合理配置副本数 |
| Flink | 分布式流处理引擎 | 支持事件时间、状态管理、Exactly-Once语义、窗口计算、状态机 | 实时计算(如流数据统计、实时告警)、复杂事件处理 | 需要内存管理(状态存储),复杂状态计算可能消耗资源;需合理配置并行度 |
4) 【示例】:以交通流量数据采集与实时处理为例,伪代码:
import kafka
producer = kafka.KafkaProducer(bootstrap_servers='kafka:9092')
traffic_data = {'timestamp': 1672506800, 'lane_id': 'L1', 'volume': 120}
producer.send('traffic_flow', value=traffic_data)
from pyflink import StreamExecutionEnvironment
env = StreamExecutionEnvironment.get_execution_environment()
# 读取Kafka主题
data = env.read_text('kafka://traffic_flow')
# 解析数据
parsed = data.map(lambda x: json.loads(x))
# 5分钟窗口计算平均流量
avg_flow = parsed.key_by('lane_id').window(TumblingEventTimeWindows.of(Time.minutes(5))).aggregate(
lambda it, acc: (it['volume'] + acc[0]) / (it['timestamp'] - acc[1] + 1),
lambda it, acc: (it['volume'] + acc[0]) / (it['timestamp'] - acc[1] + 1)
)
# 写入数据湖
avg_flow.write('hdfs://data_lake/traffic_avg_flow')
5) 【面试口播版答案】:面试官您好,针对城市大脑多源异构数据采集,我设计的是分层架构:数据采集层用Kafka解耦,流处理层用Flink保障实时计算,存储层用湖仓一体。具体来说,交通等实时数据通过传感器/API推送到Kafka,Flink实时消费并处理(比如计算流量热力图),写入数据湖。这样既保证实时性(每秒更新),又通过Kafka的持久化和Flink的Exactly-Once保证高可用。关键技术选型上,消息队列选Kafka是因为其高吞吐和持久化,流处理选Flink是因为支持状态管理和事件时间,确保数据不丢失且计算准确。
6) 【追问清单】:
7) 【常见坑/雷区】: