
1) 【一句话结论】
核心是构建以分布式消息队列(如Kafka)为传输中枢,结合多级分布式采集节点(适配不同数据源)、弹性存储(HDFS/对象存储)与计算引擎(Flink/Spark),通过分区、冗余、动态扩缩容机制,实现PB级数据的高效采集、可靠传输与弹性处理,确保高可用与可扩展性。
2) 【原理/概念讲解】
老师来解释下核心组件的设计逻辑:
数据采集系统需分层设计,从下到上分为数据源层、采集层、传输层、存储层、计算层。
类比:数据采集系统像“智能物流网络”——数据源是“货物源头”,采集节点是“智能分拣机器人”,Kafka是“高速中转站”(分区缓冲,避免堵塞),存储是“多仓仓库”(副本防丢失),计算是“智能调度中心”(按需分配资源)。
3) 【对比与适用场景】
| 组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Kafka | 分布式消息队列 | 高吞吐(10万+TPS)、持久化、多分区、高可用 | 实时日志收集、事件驱动、PB级数据传输 | 需集群管理,数据持久化成本高,延迟约1-100ms |
| Pulsar | 分布式消息+存储 | 高性能(低延迟)、多租户、容错、持久化 | 对时延敏感的实时数据、大数据分析 | 集群复杂度较高,适合多租户场景 |
| RabbitMQ | 企业级消息队列 | 可靠、灵活路由、持久化 | 传统企业应用、任务队列 | 延迟较高(几十ms),不适合PB级实时 |
| 模式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 单机采集节点 | 单节点部署,处理单一数据源 | 简单,资源受限 | 小规模数据采集(如几十GB) | 扩展性差,单点故障 |
| 分布式采集节点 | 多节点集群,负载均衡 | 水平扩展,高可用 | PB级数据采集(如日志、传感器数据) | 需统一调度(如Kubernetes),数据一致性管理(如幂等处理) |
4) 【示例】
以分布式采集节点伪代码(处理日志+API数据源)为例:
import kafka
import requests
import time
def process_log_source():
with open("log_file.log", "r") as f:
lines = f.readlines()
for line in lines:
data = {"type": "log", "content": line}
send_to_kafka(data)
def process_api_source():
response = requests.get("https://api.example.com/data")
data = {"type": "api", "content": response.json()}
send_to_kafka(data)
def send_to_kafka(data):
producer = kafka.Producer({"bootstrap.servers": "kafka-cluster:9092"})
producer.send("raw_data_topic", value=data.encode('utf-8'))
producer.flush()
while True:
process_log_source()
process_api_source()
time.sleep(1) # 控制采集频率
整体流程:数据源(日志/API)→ 采集节点(适配器处理数据格式)→ Kafka(传输)→ HDFS(存储)→ Flink/Spark(计算)。
5) 【面试口播版答案】(约90秒)
“面试官您好,针对PB级数据采集系统,核心设计思路是围绕‘分布式消息队列+多级采集节点+弹性存储计算’构建,确保高可用和可扩展性。首先,数据采集层采用分布式采集节点集群,每个节点通过适配器层处理不同数据源(如日志、API、传感器),支持动态扩容以应对数据量增长;然后,引入Kafka作为传输中枢,利用其多分区(按时间/数据源分区,分区数根据数据吞吐量计算,如分区数=数据量/单分区容量+集群节点数)和多副本(ISR机制)保障数据可靠传输;存储层采用HDFS或对象存储(如S3),通过3副本策略实现PB级数据持久化,高可用;计算层结合Flink进行实时处理(低延迟),Spark进行离线分析,通过YARN/K8s资源池动态分配资源,支持弹性伸缩。整体架构通过各组件的冗余部署(如采集节点多副本、存储副本)、动态扩缩容机制,确保系统在数据量增长时仍能保持高可用和性能稳定。”
6) 【追问清单】
7) 【常见坑/雷区】