题目
设计一个实时用户行为分析系统的大数据架构
信息
- 类型:问答
- 难度:⭐⭐
考点
Lambda架构,Kafka流处理,数据存储选型,实时与批处理整合
快速回答
核心架构应包含以下组件:
- 数据采集层:使用Kafka作为消息队列收集用户行为日志
- 实时处理层:通过Flink/Spark Streaming进行实时聚合分析
- 批处理层:用Spark处理历史数据生成校正模型
- 服务层:将实时结果与批处理结果在Druid/Pinot中合并
- 存储层:HDFS存原始数据,Redis存实时结果,HBase存明细
1. 架构设计原理
采用Lambda架构解决实时与批处理的矛盾:
- 速度层(Speed Layer):处理实时数据流,低延迟但可能不精确
- 批处理层(Batch Layer):处理全量数据,高延迟但精确
- 服务层(Serving Layer):合并两层结果提供统一视图
// 伪代码:Lambda架构结果合并
function query(userId) {
realtimeResult = redis.get("realtime:"+userId);
batchResult = druid.query("SELECT * FROM batch_table WHERE user="+userId);
return combine(realtimeResult, batchResult);
}2. 组件选型与示例
| 层级 | 组件 | 作用 |
|---|---|---|
| 采集层 | Kafka | 高吞吐日志收集,分区存储 |
| 实时处理 | Flink | 窗口聚合(示例代码) |
// Flink实时计算PV
DataStream<UserAction> stream = env.addSource(kafkaSource);
stream.keyBy(UserAction::getPageId)
.window(TumblingProcessingTimeWindows.of(Time.seconds(10)))
.sum("count");3. 最佳实践
- 数据分区:按user_id分片避免热点
- 压缩策略:Kafka启用Snappy压缩
- 容错机制:Flink Checkpoint + Kafka offset提交
- 资源隔离:实时/批处理集群分离
4. 常见错误
- 数据倾斜:未对热门page_id做分桶处理
- 时间窗口错位:事件时间/处理时间混淆
- 存储瓶颈:HBase未做预分区导致RegionServer过热
- 监控缺失:未跟踪Kafka Lag导致积压
5. 扩展知识
- Kappa架构:仅用流处理系统,通过重播实现批处理
- Iceberg/Hudi:替代HDFS的事务性数据湖方案
- OLAP引擎对比:Druid(低延迟) vs ClickHouse(高吞吐)
- 资源优化:Flink反压机制与Kafka消费者限流