
1) 【一句话结论】采用“流处理+批处理”双轨制分布式架构,结合数据分区策略(按传感器ID/时间分区),以Flink实现低延迟实时聚合(支持1-2秒内响应),以Spark实现全量离线分析(优化分区减少计算时间),通过Kafka确保数据可靠传输与分布式环境下的高效协同。
2) 【原理/概念讲解】在分布式环境中,光学传感器数据聚合需同时满足实时流处理(如传感器状态监控、异常告警,要求秒级延迟)和离线历史分析(如故障根因排查、趋势预测,允许分钟级延迟)。核心是“数据分区+并行计算”:实时聚合通过流处理框架(如Flink)对数据流进行分区(如按传感器ID或时间戳),并行处理减少延迟;离线分析通过批处理框架(如Spark)对历史数据集进行分区(如按时间范围),提高计算效率。类比:实时聚合像交通信号灯实时统计每辆车的通过速度并快速预警,离线分析像交通部门每月统计所有路段的流量数据做规划报告。
3) 【对比与适用场景】
| 特性/选型 | 实时聚合(流处理) | 离线分析(批处理) |
|---|---|---|
| 定义 | 处理持续流入的流数据,要求低延迟(秒级),支持持续输出 | 处理历史数据集,允许较高延迟(分钟级至小时级),支持复杂分析 |
| 核心框架 | Flink(持续查询、状态管理) | Spark SQL(GroupBy、窗口函数)或MapReduce |
| 数据分区策略 | 按传感器ID分区(减少数据倾斜,提高聚合并行度)或按时间戳分区(如每5分钟一个窗口) | 按时间范围分区(如按月/周分区),减少单次计算数据量 |
| 并行处理 | 高度并行(如10个并行任务处理不同传感器数据) | 并行计算(如按分区并行执行GroupBy) |
| 使用场景 | 实时监控传感器温度/光照等参数,异常值告警 | 历史数据趋势分析(如月度温度变化)、故障根因排查 |
| 注意点 | 延迟控制(窗口大小、并行度)、状态一致性(Exactly-Once) | 数据量巨大时的计算效率、分区策略对结果的影响(如时间分区避免数据倾斜) |
4) 【示例】
实时聚合(Flink,按传感器ID分区+时间窗口聚合):
// 数据流从Kafka读取
DataStream<SensorData> sensorStream = env
.addSource(new FlinkKafkaConsumer<SensorData>("sensor-topic", new SensorDataDeserialization(), properties));
// 按传感器ID分区,5秒滑动窗口聚合
DataStream<AggregatedResult> resultStream = sensorStream
.keyBy(SensorData::getSensorId) // 数据分区:按传感器ID,每个ID独立处理,减少数据倾斜
.window(TumblingEventTimeWindows.of(Time.seconds(5))) // 时间窗口:5秒内数据聚合
.aggregate(new AggregateFunction<SensorData, AggregateState, AggregatedResult>() {
@Override
public AggregateState createAccumulator() {
return new AggregateState();
}
@Override
public AggregateState add(SensorData value, AggregateState accumulator) {
accumulator.add(value);
return accumulator;
}
@Override
public AggregatedResult getResult(AggregateState accumulator) {
return new AggregatedResult(accumulator.getAvgTemp());
}
@Override
public AggregateState merge(AggregateState a, AggregateState b) {
return new AggregateState().merge(a, b);
}
});
// 输出到Kafka或消息队列
resultStream.addSink(new FlinkKafkaProducer<AggregatedResult>("aggregation-result", new ResultSerialization()));
离线分析(Spark SQL,按时间分区):
-- 按月分区处理历史数据
SELECT
sensor_id,
AVG(temp) AS avg_temp,
MAX(temp) AS max_temp,
MIN(temp) AS min_temp,
COUNT(*) AS data_count
FROM
sensor_data
WHERE
timestamp >= '2023-01-01' AND timestamp < '2023-02-01' -- 时间分区:按月
GROUP BY
sensor_id;
5) 【面试口播版答案】
面试官您好,针对新凯来的电子光学传感器数据聚合需求,我设计的方案是采用“流处理+批处理”双轨制分布式架构,结合数据分区策略提升性能。具体来说,实时聚合部分用Flink,因为它支持持续查询和状态管理,按传感器ID分区处理数据流,5秒滑动窗口计算温度平均值,延迟控制在1-2秒内,满足实时告警需求;离线分析部分用Spark SQL,按时间(如月)分区处理历史数据,支持复杂聚合(如最大/最小值、计数),用于故障根因排查和趋势分析。数据管道用Kafka,确保分布式环境下的数据可靠传输,同时通过数据分区减少计算压力,提升效率。
6) 【追问清单】
7) 【常见坑/雷区】