
1) 【一句话结论】采用“分层分布式架构”,以“Flume/Kafka作为采集与传输层,HDFS/对象存储作为持久化层,结合Flink/Spark Streaming进行实时处理”,通过“多级缓存+可靠传输协议+容错机制”保障数据不丢失与低延迟。
2) 【原理/概念讲解】老师口吻,解释各层:
3) 【对比与适用场景】
| 对比维度 | Flume | Kafka Connect | HDFS | 对象存储(如S3) |
|---|---|---|---|---|
| 定义 | 分布式日志采集系统 | Kafka的连接器 | Hadoop分布式文件系统 | 云对象存储服务 |
| 特性 | 支持多源采集(日志、数据库、文件)、Agent模式 | 与Kafka集成,作为数据源/目标 | PB级存储、高容错、适合批处理 | 弹性扩展、低成本、适合冷数据 |
| 使用场景 | 日志采集、多系统数据整合 | 数据接入Kafka(如数据库变更日志) | 批处理、离线分析 | 冷数据存储、备份、成本敏感场景 |
| 注意点 | Agent故障需监控 | 依赖Kafka集群 | 磁盘IO瓶颈 | 网络延迟、访问模式 |
4) 【示例】
伪代码示例(Flume Agent配置):
# Flume Agent配置示例
agent.sources = source1
agent.channels = channel1
agent.sinks = sink1
# Source配置(日志文件采集)
agent.sources.source1.type = exec
agent.sources.source1.command = tail -F /var/log/syslog
agent.sources.source1.channels = channel1
# Channel配置(内存通道,临时存储)
agent.channels.channel1.type = memory
agent.channels.channel1.capacity = 100000
agent.channels.channel1.transactionCapacity = 10000
# Sink配置(发送到Kafka)
agent.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSink
agent.sinks.sink1.topic = log_topic
agent.sinks.sink1.kafka.bootstrap.servers = kafka1:9092,kafka2:9092,kafka3:9092
agent.sinks.sink1.kafka.producer.type = sync
agent.sinks.sink1.kafka.producer.linger.ms = 5
agent.sinks.sink1.kafka.producer.batch.size = 16384
agent.sinks.sink1.channel = channel1
5) 【面试口播版答案】
“面试官您好,针对高并发PB级数据采集系统,我的设计思路是采用分层分布式架构。首先,数据采集层用Flume的Agent模式,支持多源数据(如日志、数据库变更)采集,通过多Agent并行处理提升吞吐。然后,传输层采用Kafka作为消息队列,利用其持久化特性缓冲数据,避免采集端与存储端速率不匹配导致的丢数据。存储层选择HDFS作为主存储,结合对象存储(如S3)存储冷数据,满足PB级存储需求。流处理层用Flink处理实时数据,通过状态管理和低延迟算子(如窗口计算)保障延迟低。可靠性方面,Kafka的多副本+持久化日志、Flume的重试机制+幂等性处理,确保数据不丢失。整体架构通过分层解耦,各层独立扩展,满足高并发、低延迟、不丢失的需求。”
6) 【追问清单】
7) 【常见坑/雷区】