
1) 【一句话结论】采用“流式实时处理+分布式离线存储”双轨方案,通过Kafka作为数据管道,Flink实现实时CTR等分析并写入HDFS实时表,HDFS+Hive支撑离线7日用户画像等查询,兼顾PB级数据的高吞吐与低延迟需求。
2) 【原理/概念讲解】老师口吻:同学们,360投放系统的用户行为日志(点击、曝光、转化)数据量极大(PB级),所以需要分“实时分析”和“离线回溯”两种场景设计。
3) 【对比与适用场景】
| 对比项 | 实时计算引擎(Flink vs Spark Streaming) | 离线存储(HDFS+Hive vs HBase+Hive) |
| 定义 | 基于事件时间的流处理引擎,支持状态管理 | HDFS分布式存储 + Hive SQL引擎 |
| 特性 | 低延迟(毫秒级)、事件时间处理、状态持久化 | 大规模数据存储、SQL查询、成本较低 |
| 使用场景 | 实时CTR、实时用户画像等低延迟场景 | 7日用户画像、历史行为分析等大规模批量查询 |
| 注意点 | 状态管理复杂度、事件时间乱序处理 | 查询延迟较长(分钟级)、不适合实时查询 |
4) 【示例】(以实时CTR计算为例,伪代码):
// 生产者将点击/曝光日志写入Kafka主题“user_action”
producer.send("user_action", "{\"user_id\":\"123\",\"action\":\"click\"}")
producer.send("user_action", "{\"user_id\":\"123\",\"action\":\"exposure\"}")
// Flink消费Kafka并计算实时CTR
FlinkJob {
// 从Kafka读取数据
stream = KafkaSource("user_action")
// 按用户ID分组,统计曝光数和点击数
grouped = stream.keyBy("user_id")
state = grouped
.map(new ClickExposureMapper())
.keyBy("user_id")
.reduce(new CTRReducer())
// 输出到HDFS实时表
state.write(new HDFSWriter("hdfs://path/realtime_ctr"))
}
// Hive实时查询某用户实时CTR
SELECT * FROM realtime_ctr WHERE user_id='123' ORDER BY timestamp DESC LIMIT 1
5) 【面试口播版答案】(约90秒):
“面试官您好,针对360投放系统PB级用户行为日志的实时分析(如实时CTR)和离线回溯(如7日用户画像)需求,我设计的方案是采用‘流式实时处理+分布式离线存储’双轨架构。具体来说,通过Kafka作为数据管道,将点击、曝光等行为日志实时写入;用Flink处理实时流,计算CTR等指标并写入HDFS的实时表,支持秒级查询;同时,历史日志存储在HDFS,用Hive生成7日用户画像等离线表,满足分钟级以上的回溯需求。这样既保证了实时分析的低延迟,又支撑了离线查询的大规模数据处理。”
6) 【追问清单】
7) 【常见坑/雷区】