Data Engineer Case Study 面试:跨源数据整合方案(Google/Microsoft 真题)
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 这样的平台,跨源数据整合需要支持:

  1. 多源数据采集:数据库、日志、API、文件等多种数据源
  2. 数据清洗和转换:标准化、去重、格式化
  3. 数据质量监控:完整性、准确性、一致性检查
  4. 元数据管理:数据血缘、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 版本:表结构变更记录
  • 数据字典:字段含义和类型

元数据查询

  • 数据发现:查找特定数据
  • 数据影响分析:变更影响评估

关键技术决策

为什么选择这个方案?

  1. 多源支持:支持各种数据源类型
  2. 实时性:CDC 支持实时数据同步
  3. 可扩展性:支持数据量增长
  4. 数据质量:内置数据质量检查

技术选型对比

方案优势劣势适用场景
CDC实时同步配置复杂数据库变更捕获
Spark高性能运维复杂批量数据处理
Kafka高吞吐存储有限消息队列
Data Quality质量保障性能开销数据质量检查

面试官追问

常见追问问题

  1. 如果数据量增加 10 倍,架构如何调整?

    • 增加 Kafka Partition 数量
    • 增加 Spark 执行节点
    • 优化数据分区策略
  2. 如果要求多租户隔离,如何实现?

    • 数据隔离:按 tenant_id 分区
    • 资源隔离:独立 Kafka Topic
  3. 如果某个组件宕机,如何保证系统可用性?

    • Kafka:Replica 机制
    • Spark:容错机制
    • 数据备份:定期备份关键数据

面试技巧

回答框架

  1. 澄清需求:明确业务场景和技术约束
  2. 架构设计:画出架构图,说明每个组件的职责
  3. 技术选型:解释为什么选择某个技术
  4. 权衡分析:讨论方案的优缺点

高分回答要点

  • 数据量级:主动提到日均 TB 级数据
  • 延迟要求:小时级到分钟级
  • 一致性:最终一致性
  • 数据质量:内置数据质量检查

本文整理自真实 Data Engineer 面试经验,架构设计经过实际验证。


💡 需要面试辅导?

如果你对准备技术面试感到迷茫,或者想要个性化的面试指导和简历优化,欢迎联系 Interview Coach Pro 获取一对一辅导服务。

👉 联系我们 获取专属面试准备方案

准备好拿下下一次面试了吗?

获取针对你的目标岗位和公司的个性化辅导方案。

联系我们