
1) 【一句话结论】
设计一个基于Kafka+Spark的ETL管道,分采集、清洗、转换、加载阶段,结合实时流处理与批量处理,通过数据校验、监控和容错机制(如Kafka持久化、Spark检查点)保证数据准确性与容错性。
2) 【原理/概念讲解】
ETL是数据从源到目标的数据处理流程,分为三阶段:
3) 【对比与适用场景】
| 类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 实时ETL(流处理) | 基于流数据,低延迟(秒级) | 低延迟、高吞吐、持续处理 | 游戏实时用户行为分析(如实时活跃用户数) | 需高可用消息队列,资源消耗大,复杂度较高 |
| 批量ETL(批处理) | 基于周期性任务,高吞吐 | 高吞吐、适合历史数据、延迟较高(小时/天) | 游戏日志每日统计(如用户留存率) | 适合离线分析,不适合实时需求 |
4) 【示例】(伪代码)
game_logs,配置分区数(如10),副本数(如3)。game_logs,过滤空记录,校验字段(如user_id非空,action_type在枚举内)。timestamp转换为yyyy-MM-dd HH:mm:ss),转换字段(如action_type映射为"login"、"click"等)。user_actions,使用INSERT OVERWRITE TABLE user_actions SELECT ...覆盖旧数据。5) 【面试口播版答案】
面试官您好,针对游卡的游戏日志ETL需求,我会设计一个分阶段的管道,结合实时处理与批量处理。首先,数据采集阶段,我们用Kafka作为消息队列,服务器日志通过Kafka生产者写入主题game_logs,解耦采集与后端处理。然后清洗阶段,用Spark Streaming消费数据,过滤无效记录(如空日志),校验字段(如用户ID、操作类型是否合法),保证数据质量。转换阶段,将日志解析为结构化数据,格式化时间戳,转换字段(如操作类型映射为枚举)。加载阶段,将数据写入Hive表,使用INSERT OVERWRITE覆盖旧数据,保证数据一致性。为了保证准确性,我们在每个阶段加入数据校验(如计算数据量、检查关键字段分布)和监控(如日志记录处理状态)。容错性方面,Kafka的持久化存储确保数据不丢失,Spark的检查点机制处理失败任务,重试机制保证处理不中断。这样整个管道既能处理实时数据(如用户实时操作),也能处理批量数据(如每日日志统计),满足分析需求。
6) 【追问清单】
SELECT COUNT(*) FROM user_actions),检查字段正确性(如SELECT user_id, action_type FROM user_actions LIMIT 10),与源数据对比(如抽样数据与Kafka中的原始日志对比)。7) 【常见坑/雷区】