data-engineersystem-designcase-studyinterviewarchitecture
Data Engineer Case Study 面试:跨源数据整合方案(Google/Microsoft 真题)
本文基于真实候选人面经整理Data面试全流程。还原面试题目、解题思路与技术考察重点,覆盖Spark、Kafka、Flink、MySQL,附详细准备策略助你高效备战。
Sam · · 12 分钟阅读
面试真题来源:Google/Microsoft Data Engineer 系统设计面试
难度:Hard | 考察领域:System Design / Architecture
核心考点:数据整合、ETL 流程、数据质量、数据治理
面试场景
这是 Google/Microsoft DE 面试中非常经典的一道 Case Study 题:
题目:设计一个支持多源数据整合的平台
面试官通常会给你一个真实的业务场景,要求你设计完整的数据处理架构。这道题考察的是你对数据整合、ETL 流程、数据质量、数据治理的全面理解。
业务需求分析
核心业务场景
在 Google/Microsoft 这样的平台,跨源数据整合需要支持:
- 多源数据采集:数据库、日志、API、文件等多种数据源
- 数据清洗和转换:标准化、去重、格式化
- 数据质量监控:完整性、准确性、一致性检查
- 元数据管理:数据血缘、schema 版本管理
关键约束条件
- 数据量:日均 TB 级数据
- 延迟要求:小时级到分钟级
- 可用性:99.9% SLA
- 一致性:最终一致性
整体架构设计
┌─────────────────────────────────────────────────────────────────┐
│ Data Sources │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Databases │ │ APIs │ │ Files │ │
│ │ (MySQL等) │ │ (REST等) │ │ (CSV等) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
└─────────┼────────────────┼────────────────┼─────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Ingestion Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ CDC │ │ API │ │ File │ │
│ │ (变更捕获) │ │ Connectors │ │ Connectors │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Processing Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Kafka │ │ Spark/Flink│ │ Data │ │
│ │ (消息队列) │ │ (数据处理) │ │ Quality │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Storage Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Data │ │ Data Lake │ │ Metadata │ │
│ │ Warehouse │ │ (原始数据) │ │ Store │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
详细设计方案
1. 数据采集层
数据源类型:
- 关系型数据库:MySQL、PostgreSQL、Oracle 等
- NoSQL 数据库:MongoDB、Cassandra 等
- API 接口:REST、GraphQL 等
- 文件数据:CSV、JSON、Parquet 等
采集方案:
- 使用 CDC (Change Data Capture) 捕获数据库变更
- 使用 API Connectors 拉取外部数据
- 使用 File Connectors 处理文件数据
# CDC 采集示例
from confluent_kafka import Producer
def cdc_callback(err, msg):
if err:
print(f'CDC error: {err}')
else:
print(f'Delivered message to {msg.topic()} [{msg.partition()}]')
producer = Producer({
'bootstrap.servers': 'kafka:9092',
'client.id': 'cdc-producer'
})
# 捕获数据库变更
def capture_changes(table_name, changes):
for change in changes:
message = {
'table': table_name,
'operation': change['operation'], # INSERT/UPDATE/DELETE
'data': change['data'],
'timestamp': change['timestamp']
}
producer.poll(0)
producer.produce(
topic=f'cdc.{table_name}',
value=json.dumps(message),
callback=cdc_callback
)
2. 数据处理层
数据清洗:
- 过滤无效数据
- 数据格式化
- 去重处理
数据转换:
- 字段映射
- 类型转换
- 数据标准化
# Spark 数据处理示例
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, when, upper, trim
spark = SparkSession.builder.appName("DataIntegration").getOrCreate()
# 读取多源数据
mysql_df = spark.read.format("jdbc") \
.option("url", "jdbc:mysql://mysql:3306/db") \
.option("dbtable", "users") \
.load()
api_df = spark.read.json("s3://bucket/api-data/")
# 数据清洗和转换
cleaned_df = mysql_df.select(
col("user_id"),
upper(trim(col("name"))).alias("name"),
col("email"),
when(col("age") > 0, col("age")).otherwise(None).alias("age")
)
# 合并数据
merged_df = cleaned_df.unionByName(api_df)
# 输出到数据仓库
merged_df.write.mode("overwrite").saveAsTable("integrated_users")
3. 数据质量层
质量检查:
- 完整性检查:必填字段是否为空
- 准确性检查:数据格式是否正确
- 一致性检查:跨表数据是否一致
监控告警:
- 数据质量报告
- 异常数据告警
- 数据血缘追踪
# 数据质量检查示例
from pyspark.sql.functions import col, count, when
def check_data_quality(df, table_name):
total_rows = df.count()
# 完整性检查
null_counts = df.select([
count(when(col(c).isNull(), c)).alias(c)
for c in df.columns
]).collect()[0]
# 准确性检查
invalid_emails = df.filter(
col("email").rlike("^[^@]+@[^@]+\.[^@]+$")
).count()
# 生成质量报告
quality_report = {
"table": table_name,
"total_rows": total_rows,
"null_counts": dict(null_counts.asDict()),
"invalid_emails": invalid_emails
}
return quality_report
4. 元数据管理
元数据存储:
- 数据血缘:数据来源和处理流程
- Schema 版本:表结构变更记录
- 数据字典:字段含义和类型
元数据查询:
- 数据发现:查找特定数据
- 数据影响分析:变更影响评估
关键技术决策
为什么选择这个方案?
- 多源支持:支持各种数据源类型
- 实时性:CDC 支持实时数据同步
- 可扩展性:支持数据量增长
- 数据质量:内置数据质量检查
技术选型对比
| 方案 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| CDC | 实时同步 | 配置复杂 | 数据库变更捕获 |
| Spark | 高性能 | 运维复杂 | 批量数据处理 |
| Kafka | 高吞吐 | 存储有限 | 消息队列 |
| Data Quality | 质量保障 | 性能开销 | 数据质量检查 |
面试官追问
常见追问问题
-
如果数据量增加 10 倍,架构如何调整?
- 增加 Kafka Partition 数量
- 增加 Spark 执行节点
- 优化数据分区策略
-
如果要求多租户隔离,如何实现?
- 数据隔离:按 tenant_id 分区
- 资源隔离:独立 Kafka Topic
-
如果某个组件宕机,如何保证系统可用性?
- Kafka:Replica 机制
- Spark:容错机制
- 数据备份:定期备份关键数据
面试技巧
回答框架
- 澄清需求:明确业务场景和技术约束
- 架构设计:画出架构图,说明每个组件的职责
- 技术选型:解释为什么选择某个技术
- 权衡分析:讨论方案的优缺点
高分回答要点
- 数据量级:主动提到日均 TB 级数据
- 延迟要求:小时级到分钟级
- 一致性:最终一致性
- 数据质量:内置数据质量检查
本文整理自真实 Data Engineer 面试经验,架构设计经过实际验证。
💡 需要面试辅导?
如果你对准备技术面试感到迷茫,或者想要个性化的面试指导和简历优化,欢迎联系 Interview Coach Pro 获取一对一辅导服务。
👉 联系我们 获取专属面试准备方案