
1) 【一句话结论】采用流处理(如Flink+Kafka)处理实时数据,批处理(如Spark Structured Streaming)处理历史数据,结合CDC和Exactly-Once语义保证数据一致性与低延迟,通过消息队列解耦系统以提升扩展性和容错性。
2) 【原理/概念讲解】
首先,流处理(如Apache Flink)是实时处理连续数据流的技术,适用于需要秒级延迟的场景(如产线实时监控);批处理(如Spark Structured Streaming)是处理历史数据或批量数据的方案,适用于分析趋势、优化工艺(如每天汇总良率数据)。
数据一致性通过消息队列的事务机制(如Kafka事务)和流处理的事务处理(如Flink的分布式事务)实现,确保每个数据只被处理一次(Exactly-Once)。低延迟通过流处理的微批处理(将连续数据分成小批次,如每100ms处理一个批次),结合状态管理(如Flink的检查点)减少延迟。
类比:流处理像实时看股票行情(秒级更新),批处理像每天总结交易报告(汇总分析),两者结合能同时满足实时反馈和深度分析。
3) 【对比与适用场景】
| 特性 | 流处理(如Flink) | 批处理(如Spark Structured Streaming) |
|---|---|---|
| 定义 | 实时处理连续数据流 | 处理历史数据或批量数据 |
| 特性 | 低延迟(秒级)、高吞吐、状态管理 | 较高延迟(分钟级)、支持复杂分析 |
| 使用场景 | 实时监控、实时告警、实时计算 | 趋势分析、数据挖掘、历史数据汇总 |
| 注意点 | 需处理数据乱序、水印(Watermark) | 批处理周期长,适合非实时分析 |
4) 【示例】(伪代码)
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.table import StreamTableEnvironment, Table, EnvironmentSettings
env = StreamExecutionEnvironment.get_execution_environment()
t_env = StreamTableEnvironment.create(env, environment_settings=EnvironmentSettings.in_streaming_mode())
# 从Kafka消费数据
t_env.connect(Kafka().topic("process_data").start_from_latest()).with_format(...).in_schema(schema).register_table_source("sensor_data")
# 实时计算良率
result_table = t_env.from_path("sensor_data").select(
"sensor_id, avg(temperature) as avg_temp, count(*) as count"
).group_by("sensor_id").window(TumblingProcessingTimeWindow.of("1 minute"))
# 写入结果
result_table.insert_into("realtime_metrics", output_format(...))
env.execute("Realtime Processing")
from pyspark.sql import SparkSession
from pyspark.sql.functions import window, col
spark = SparkSession.builder.appName("Batch Processing").getOrCreate()
# 从Kafka读取历史数据(过去24小时)
df = spark.readStream.format("kafka").option("topic", "process_data").option("kafka.bootstrap.servers", "kafka:9092").load()
# 解析数据
df = df.selectExpr("CAST(value AS STRING)").select(from_json(col("value"), schema).alias("data"))
# 批处理分析(24小时良率趋势)
batch_df = df.groupBy(window(col("data.timestamp"), "24 hours"), "sensor_id").agg(
avg(col("data.quality")).alias("avg_quality")
)
# 写入数据仓库
batch_df.writeStream.format("parquet").option("path", "hdfs://path/to/batch_results").start()
5) 【面试口播版答案】
面试官您好,针对半导体制造的超10TB实时数据需求,我设计的架构是流处理+批处理结合的方案。具体来说:
这样既能满足实时监控的需求,又能通过批处理进行深度分析,同时保证数据一致性和低延迟。
6) 【追问清单】
7) 【常见坑/雷区】