大数据架构深度解析:Flink 工业 IoT 异常检测:从边缘采样到云端告警的数据闭环
一、问题场景一条产线每秒上千条传感器数据某电机产线每台设备有温度、振动、电流 3 路传感器采样频率 10Hz。100 台设备并发 →每秒约 3000 条遥测。传统做法是存下来再分析等发现轴承过热产线可能已经烧了。我们要的闭环是边缘采样 → Kafka 汇聚 → Flink 实时算异常 → 云端告警/看板 → 反向下发降速指令。本篇聚焦中间那段实时异常检测也是周五连载云边协同的大脑部分。二、方案设计整体数据流[边缘网关] --MQTT-- [Kafka topic: sensor.raw] | [Flink Job] keyBy(deviceId) → 滑动窗口(z-score) → 异常判定 → ├─ 正常 → 写入时序库(Put) └─ 异常 → 告警(WebSocket/邮件) 标记为什么用z-score 滑动窗口而不是简单阈值因为同一台电机在不同工况下正常温度不一样绝对阈值会误报。用最近窗口的均值/标准差做动态基线更鲁棒。三、分步实现PyFlink可读性优先1. 定义数据结构与源from pyflink.datastream import StreamExecutionEnvironment from pyflink.datastream.connectors.kafka import KafkaSource, KafkaOffsets from pyflink.common.serialization import SimpleStringSchema from pyflink.common.watermark_strategy import WatermarkStrategy import json ​ env StreamExecutionEnvironment.get_execution_environment() env.set_parallelism(4) ​ source KafkaSource.builder() \ .set_bootstrap_servers(kafka:9092) \ .set_topics(sensor.raw) \ .set_group_id(flink-anomaly) \ .set_starting_offsets(KafkaOffsets.latest()) \ .set_value_only_deserializer(SimpleStringSchema()) \ .build() ​ ds env.from_source(source, WatermarkStrategy.no_watermarks(), kafka)2. 解析 keyBy 设备def parse(record): e json.loads(record) return (e[deviceId], e[metric], float(e[value]), int(e[ts])) ​ parsed ds.map(parse, output_type...) keyed parsed.key_by(lambda x: (x[0], x[1])) # 按 设备指标 分组3. 滑动窗口 z-score 异常检测核心算子from pyflink.datastream.window import SlidingEventTimeWindows from pyflink.common.time import Time ​ windowed keyed \ .window(SlidingEventTimeWindows.of(Time.minutes(5), Time.seconds(30))) \ .process(AnomalyDetector()) class AnomalyDetector(KeyedProcessWindowFunction): def process(self, key, ctx, events): vals sorted([e[2] for e in events]) n len(vals) mean sum(vals) / n var sum((v - mean) ** 2 for v in vals) / n std var ** 0.5 1e-6 # 用窗口末尾的点做 z-score 判定 latest vals[-1] z (latest - mean) / std if abs(z) 3.0: # 3σ 准则 yield { deviceId: key[0], metric: key[1], value: latest, z: round(z, 2), mean: round(mean, 2), ts: ctx.current_watermark }4. 异常分流到告警 Sinkanomalies windowed.map(lambda a: json.dumps(a)) anomalies.add_sink(KafkaSink.builder() .set_bootstrap_servers(kafka:9092) .set_record_serializer(..., topicsensor.alert) .build())下游一个 Spring Boot / Node 服务订阅sensor.alert推 WebSocket 到运维看板并按设备 ID 触发降级指令回写边缘网关。四、踩坑记录乱序事件必须有 Watermark工业网关网络抖动事件迟到是常态。不设 watermark 允许的延迟窗口会提前触发导致漏检。状态膨胀keyBy(deviceId, metric)后窗口状态随时间增长务必配State TTL否则一周后 JobManager 内存爆炸。z-score 对突发不敏感纯统计方法抓不出缓变劣化。生产里常叠加斜率检测 / EWMA本篇留给进阶版。不要在 process 里查数据库每条事件去查设备元数据会拖垮吞吐预先广播BroadcastState下发设备配置。五、性能数据单机基准指标数值吞吐单 TaskManager4 核约12 万 events/s端到端延迟采样→告警p99 800ms100 台设备 3 路传感器稳态 CPU ~55%Flink 把事后看报表变成了事中拦风险。这套管道正是我们整个 Edge AI 全栈的数据主动脉——边缘负责采和跑轻模型云端 Flink 负责 aggregation 和全局异常判定。

相关新闻

STM32启动流程深度剖析:从复位向量到RTOS任务调度

STM32启动流程深度剖析:从复位向量到RTOS任务调度

我见过太多人学 STM32,第一步是点灯,第二步是跑例程,但很少有人认真想过一个问题:给芯片上电的那个瞬间,CPU 到底是从哪一行代码开始执行的?等到项目上了量,现场出现“上电不开机”“复位后跑飞…

2026/10/4 19:44:39 阅读更多 →
SSM+Vue医院挂号系统源码实战:环境搭建、预约链路与避坑指南

SSM+Vue医院挂号系统源码实战:环境搭建、预约链路与避坑指南

简介:这是一套面向高校计算机专业毕业设计与课程实践的医院门诊在线预约挂号管理系统完整源码,采用Java语言与SSM框架开发,前端基于Vue配合Ajax交互,后端整合Spring、SpringMVC、MyBatisPlus,数据库使用MySQL 5.7&…

2026/10/4 19:44:39 阅读更多 →
拟牛顿法推导详解:从割线方程到BFGS更新公式

拟牛顿法推导详解:从割线方程到BFGS更新公式

最优化这门课,学到拟牛顿法的时候,很多人会有一种“咦,好像懂了,但让自己推一遍就卡壳”的感觉。尤其是教材里DFP、BFGS那一串公式,看起来像变魔术一样,不知道当初是怎么凑出来的。这篇文章就是我整理的一份…

2026/10/4 19:44:38 阅读更多 →

最新新闻

云桌面或无联网环境如何离线安装VS Code插件:TaoToken统一Key通道下的vsix手动部署与验证

云桌面或无联网环境如何离线安装VS Code插件:TaoToken统一Key通道下的vsix手动部署与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 21:10:16 阅读更多 →
一文详解Cache Aside(旁路缓存模式)

一文详解Cache Aside(旁路缓存模式)

最经典、最常用的缓存设计模式,业务代码自己维护缓存,缓存组件不感知数据库,缓存和 DB 相互独立,所以叫旁路。适用:Redis MySQL 这类组合,几乎所有业务系统都在用。旁路 缓存不在数据库读写的主链路里面&…

2026/10/4 21:10:16 阅读更多 →
从 failed to load plugins 看插件系统:加载失败根因与排查

从 failed to load plugins 看插件系统:加载失败根因与排查

我不止一次在启动日志里被一行failed to load plugins或plugins did not activate的告警搞得头皮发麻。尤其是那些把插件机制做得比较“野”的工具,装了一堆插件,最后启动时某个不显眼的报错让你排查一整个下午。这次不聊某个具体产品,而是从…

2026/10/4 21:10:15 阅读更多 →
西门子AF框架UMAC用户权限配置与实战排错指南

西门子AF框架UMAC用户权限配置与实战排错指南

1. 项目概述:为什么“AF框架翻译”不是简单的文字搬运,而是西门子自动化工程师的必修课“西门子AF框架翻译-第十七章”这个标题乍看像是一份普通的文档翻译任务,但如果你在TIA Portal环境下调试过S7-1500 PLC的用户管理功能,或者被…

2026/10/4 21:09:15 阅读更多 →
GLM 5.3 深度排查只读重入:跨合约价格预言机瞬时汇率失真挖掘

GLM 5.3 深度排查只读重入:跨合约价格预言机瞬时汇率失真挖掘

GLM 5.3 深度排查只读重入:跨合约价格预言机瞬时汇率失真挖掘在所有智能合约漏洞类型中,“只读重入(Read-only Reentrancy)”被很多顶级安全专家公认为隐蔽性最强、破坏力最大的幽灵杀手。它不同于 The DAO 时代那种在一个函数内反…

2026/10/4 21:09:15 阅读更多 →
为什么单纯加密不够:zk-ML 与同态加密 FHE 在去中心化 AI 中的算力开销对比

为什么单纯加密不够:zk-ML 与同态加密 FHE 在去中心化 AI 中的算力开销对比

为什么单纯加密不够:zk-ML 与同态加密 FHE 在去中心化 AI 中的算力开销对比在去中心化 AI(Decentralized AI)的前沿讨论中,密码学极客们最常挂在嘴边的两个顶级名词无疑是 zk-ML(零知识机器学习) 与 FHE&am…

2026/10/4 21:09:15 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →