ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java大数据实战:智能家居能源管理平台搭建全解析

Java大数据实战:智能家居能源管理平台搭建全解析 去年春天我们团队接到一个挺有挑战的活给一家智能家居公司搭一套能源管理平台。他们的设备已经铺了不少智能电表、智能插座、空调、热水器、光伏逆变器都在线但数据全堆在MySQL里跑一次日报要几分钟想定位“哪个小区、哪一户空调耗电异常”基本靠运气。老板拍板要上大数据我带着Java技术栈从零把这条链路搭了起来。整条链路做完之后我最大的感受是Java在智能家居能源管理这个场景里不是“能用”而是“很稳”。从设备接入、消息中间件、流式计算到数据服务和权限控制Java生态几乎覆盖了每一个环节。这篇文章我会把整个项目的设计思路、技术选型、核心实现和踩过的坑一条条摊开讲适合三类人看准备转型大数据方向的Java后端工程师、做智能家居或者能源物联网的项目负责人以及想了解能耗数据到底怎么变成节能决策的产品经理。1. 项目背景与整体方案构思智能家居能源管理这个题目听起来像是“做个App看电费”但真正落地的时候数据规模和技术复杂度会快速超出预期。这一节先讲清楚我们当时面对的真实问题以及为什么最终选择了Java大数据这条组合路线。1.1 智能家居能源管理要解决的真实痛点做能源管理第一步是把“用电”这件事量化到设备级和房间级。用户的需求很直接哪台设备最耗电、这个月电费为什么比上个月贵、能不能把热水器自动挪到谷电时段运行。这些需求背后对应的技术问题远不是一条SQL能解决的。我们当时接入的设备包括智能电表、智能插座、空调控制器、热水器、地暖、光伏逆变器和储能电池。设备上报频率从秒级到分钟级不等每一条消息里至少包含设备ID、时间戳、功率、电压、电流、电量等字段。做了一次容量估算假设一户有50个设备平均每台每分钟上报1条数据每条JSON约260字节单户单天的数据量就是50×1440×260B大约18.7MB。如果平台接入3000户一天新增原始数据接近56GB。这个量级丢给传统MySQL写入和聚合都会很吃力更不用说还要按小时、按天、按小区做多维汇总。另一个痛点是数据价值没有被利用。原始数据只是躺在数据库里的数字用户关心的“节能建议”需要经过建模、异常检测和策略编排才能产生。比如发现某户空调在无人时段高功率运行系统要能自动识别并触发待机断电再比如根据电网峰谷电价和光伏预测决定储能电池什么时候充电、什么时候放电。这些决策逻辑需要放在可靠的流批计算框架上Java生态在这里是主力。1.2 为什么选Java而不是Python项目的技术栈之争团队内部其实吵过一轮。当时有人提议用Python做数据分析和算法原型因为Pandas确实方便。但生产系统最终选定Java理由很现实。第一团队现有积累和线上稳定性。我们面对的是一套7×24小时运行的物联网平台设备接入、告警服务、用户管理全是Java Spring Boot写的用Java做大数据链路可以共享同一套工程规范、监控体系和发布流程不需要维护两套技术栈。第二大数据框架对Java的亲和度最高。Flink、Spark、Kafka这些核心组件全部跑在JVM上Flink的DataStream API用Java写起来最顺手Spark用Java写虽然啰嗦一点但和Hive数仓的集成非常成熟。第三设备协议解析场景更适合静态类型语言。智能家居的协议字段五花八门Java的强类型和序列化框架Protobuf、Avro能在编译期挡住很多字段错误避免上线后才发现解析错位。不是Python不好而是要看场景。我的做法是算法原型、离线分析实验用Python生产数据管道、在线服务、策略执行全部用Java。两者各干各擅长的活不搞一刀切。1.3 系统架构与数据流转设计整个平台的架构本质上是一条从设备到决策的数据流水线我把它拆成五层设备接入层智能设备通过MQTT/CoAP/HTTP接入Java Netty网关负责协议解析、设备鉴权和消息转发。消息传输层Kafka作为统一数据总线削峰填谷承接设备原始消息和告警事件。计算层Flink做实时流式计算Spark/Hive做离线批量计算两者共用一份Kafka数据源形成经典的Lambda架构。存储层原始明细进TDengine时序数据库离线聚合结果进ClickHouse元数据和业务配置放MySQL/Redis。应用层Spring Boot提供REST API数据大屏用ECharts呈现权限控制贯穿所有API。这个架构不是一次到位而是根据业务迭代逐步加组件。刚开始只有设备和MySQL后来报表跑不动了加了Hive再后来用户要实时功率和即时告警加了Kafka和Flink最后做多维分析和权限隔离才引入ClickHouse和Ranger。每一步都对应一个具体的业务痛点组件没有一个是白加的。2. 设备接入与数据采集先把数据拿稳数据采集是整个项目的地基。地基没打牢后面所有计算都是空中楼阁。这一节讲设备接入协议、Java网关实现、数据清洗和Kafka调优都是实操里反复验证过的方案。2.1 接入协议选型与Java网关实现智能家居设备的接入协议五花八门但主流的就三种MQTT、CoAP、HTTP。MQTT最适合大量设备做低带宽、长连接的消息上报是我们当时的主选。网关部分我们没有直接裸写Netty而是选用了EMQX作为MQTT Broker业务侧用Java集成EMQX客户端做消息转发。这么做的好处是Broker层面的连接管理、心跳保活、QoS策略EMQX已经做得很成熟我们只需要关注协议适配和业务转发。Topic规划上我们按照层级结构设计house/{houseId}/power/{deviceId}这样既方便Kafka按户分发也方便离线数仓做分区裁剪。设备消息体统一成标准格式字段至少包含这些{ deviceId: socket_003205, houseId: H100023, timestamp: 1719302400000, metrics: { power: 1250.5, voltage: 220.1, current: 5.8, energy: 12.34 }, msgId: msg_8f3a2c }msgId一定要在设备端生成这是后续做去重和乱序判断的重要依据。网关接受到消息后先做基本校验再通过Kafka生产者发送不在这层做复杂的业务逻辑保证接收入口足够轻。2.2 数据清洗、乱序处理与Flink管道设备数据进了Kafka只是第一步接下来要面对脏数据。我们线上遇到最多的问题有三类重复上报、乱序到达、异常突刺。重复上报的原因很多设备断网重连后重发、MQTT QoS1语义下的消息重复、客户端重试机制导致的多写。我们的去重策略是“设备IDmsgId时间窗口去重”用Flink的KeyedProcessFunction配合RocksDB状态保存最近5分钟内的msgId重复消息直接丢掉。乱序问题更隐蔽。设备时钟不准、网络抖动、MQTT消息被多个节点消费都会导致下游拿到的数据时间戳不是单调递增的。处理乱序不是简单地“按时间排序”而是要引入事件时间和Watermark机制。比如一个设备上报了14:00:05的功率但我们这条消息到达时已经是14:00:35如果按处理时间统计就会算错窗口。我们统一用事件时间作为计算基准Watermark延迟设为30秒允许一定程度的乱序超出延迟窗口的数据则丢弃。清洗之后的数据进入计算层我用Flink写了一个Java管道结构大致是这样的DataStreamDeviceMetric stream env .addSource(new FlinkKafkaConsumer(raw_device_msg, new AvroDeserializationSchema(), kafkaProps)) .assignTimestampsAndWatermarks( WatermarkStrategy.DeviceMetricforBoundedOutOfOrderness(Duration.ofSeconds(30)) .withTimestampAssigner((metric, ts) - metric.getTimestamp())) .filter(new DeduplicateFilter()) .map(new MetricNormalizer()); stream.keyBy(DeviceMetric::getHouseId) .process(new PowerAggregator()) .addSink(new ClickHouseSink());这段代码里有几个关键点。DeduplicateFilter是ValueState去重MetricNormalizer负责单位换算和字段修正比如有的电表上报的是kW有的是W统一换算成W。PowerAggregator按户聚合实时总功率每20秒输出一次这样大屏上的曲线才能平滑。2.3 Kafka分区与性能参数调优Kafka是整个流水线的数据中枢分区设计直接影响吞吐和消息有序性。我们按houseId计算分区键保证同一户的数据始终进入同一个分区这样Flink下游按户做聚合时不需要跨分区拼数据能省掉一次重分区。分区数量按消费速率估算。我们高峰期每秒大约2500条消息单分区每秒能扛100MB级别的吞吐实际上瓶颈不在网络而在后续消费者的处理速度。我们总共规划了12个分区对应Flink的并行度12让每个并行实例处理约200户的数据负载比较均衡。生产者的关键参数我调了这几个acksall保证消息不丢这是能源数据的底线。linger.ms10适当增加延迟换取批量发送降低小包风暴。batch.size64KB提高吞吐。retries3允许网络抖动下的短暂重试但配合幂等生产者避免重复。调完参数后95线延迟稳定在20毫秒以内单日消息量在1.2亿条级别时没有出现积压。Kafka监控一定要做好我们当时用Kafka Manager看消费延迟只要lag超过5000条就触发告警防止下游故障导致的消息堆积失控。3. 存储体系与计算链路的选型实践数据链路跑通之后最头痛的问题是存储。传统关系型数据库在时序数据面前非常吃力这一节讲我们为什么换存储、怎么换以及离线实时两条计算链路的落地细节。3.1 时序存储为什么不能继续用MySQL刚接手项目时所有设备数据都写在一张MySQL大表里单表几十亿行写入已经很慢聚合查询更是动不动就全表扫描。MySQL不是不能存时序数据而是它的索引和存储结构对“按时间范围高频写入、按时间维度聚合”这类场景支持得不好。我们的替代方案评估了三类HBase、时序数据库TDengine/InfluxDB、OLAP数据库ClickHouse。最终选型是“双轨制”实时明细和短周期聚合用TDengine离线大宽表和多维分析用ClickHouse。之所以留TDengine是因为它的超级表模型非常适合我们的设备结构一台设备一张子表设备维度作为标签列查询时按时间戳自动过滤平均写入速度比传统数据库高一两个数量级。建表的SQL大致是这样CREATE STABLE meters (ts TIMESTAMP, power FLOAT, voltage FLOAT, current FLOAT, energy FLOAT) TAGS (deviceId BINARY(32), houseId BINARY(16));子表自动按deviceId建立查询某台设备最近一小时功率曲线SQL依然很简洁而且不用建一堆二级索引。TDengine原生支持数据保留策略原始数据保留30天超过自动清理省了不少运维成本。3.2 离线计算链路从Hive数仓到Spark聚合离线计算主要服务报表、账单和算法训练。我们用Hive做数仓分层酱料是原始数据落HDFSODS层原样保留DWD层做清洗和维度退化DWS层做主题汇总ADS层直接服务报表。数仓表按时间dt和设备维度做分区查询能走分区裁剪不是全表扫描。例如DWS层有一张按小时聚合的用电表每个分区存一天24个小时的数据Spark SQL做聚合时非常快。小时级聚合的SQL长这样INSERT OVERWRITE TABLE dws_house_hour_energy PARTITION (dt2024-06-25) SELECT houseId, hour(ts) AS hour, sum(energy) AS total_energy, avg(power) AS avg_power, max(power) AS peak_power FROM dwd_device_metric WHERE dt2024-06-25 GROUP BY houseId, hour(ts);跑批任务用Spark on Yarn执行主要原因是Spark的SQL优化器比Hive原生执行引擎强不少尤其是Join和聚合阶段。数据落地格式我统一选了Parquet Snappy压缩一方面列式存储对这类聚合查询友好另一方面压缩比能到3比1以上3000户一个月的明细数据压缩后也就400GB上下。3.3 实时计算链路Flink窗口与状态管理实时链路的核心是让决策看到“现在”。我们主要做了两类计算20秒粒度的户级实时功率以及分钟级的异常用电检测。Flink里用窗口计算非常顺手。户级功率用滑动窗口HOP做20秒聚合每5秒触发一次保证大屏数据不过度延迟也不抖动。分钟级异常检测用滚动窗口对每户每分钟的功率序列做特征提取然后判断是否偏离该户的历史基线。窗口计算要特别注意状态大小。如果按户保存7天分钟级数据3000户就是3000×7×1440个点状态量级不大RocksDB状态下每key都很小问题不大。但千万别把所有设备明细都放状态里该落外部存储的落外部存储Flink状态只保留必要的窗口中间结果。Checkpoint配置上我们设了3分钟一次间隔10分钟允许失败3次。刚开始用文件系统状态后端后来发现恢复时间长改成RocksDBcheckpoint恢复从分钟级降到秒级。这个小改动在618这类促销活动期间设备上报量翻倍时救了我们一命。4. 节能优化算法与策略落地能源管理平台的终极价值不是“能看到”而是“能优化”。这一节是整篇文章最实战的部分怎么把数据变成节能动作以及如何科学评估节能效果。4.1 能耗基线与设备画像先学会“看懂”数据节能的前提是知道“正常该是多少”。如果连基线都没有任何“异常”告警都是拍脑袋。设备画像是我们做的第一件事。每台设备我们建模了这些特征运行时段分布、平均功率、功率波动率、能效比、待机功耗等。比如一台空调正常运行时的功率曲线是阶梯式上升再下降如果出现长时间高频启停说明可能存在问题。再比如冰箱正常工况下功率呈周期性波动如果连续几小时无波动要么是停机了要么是传感器故障。基线模型不用一上来就上机器学习。我强烈建议先做统计基线按“工作日/周末”和“小时”维度取历史数据的中位数和四分位距IQR。比如某户周一上午10点的用电基线是2.5kWIQR是0.8kW那当实时功率超过4.1kWQ31.5IQR时就可以标记为异常偏高。这种做法简单、可解释、上线快用户问“为什么告警”你能清清楚楚说出计算过程。4.2 异常用电检测从阈值到统计模型早期方案用的是固定阈值比如功率超过10kW就告警。后来发现这种方案误报率高得离谱别墅用户和单身公寓的基线完全不是一个量级冬天和夏天的空调负载也完全不同。固定阈值只能当第一道粗筛不能做精细检测。我们最终落地的是“统计基线规则引擎”的组合。统计基线负责找离群点规则引擎负责结合上下文做判断。一个比较成熟的检测逻辑是对每户每台设备用最近28天的同小时数据计算中位数和IQR然后判断当前窗口特征是否超过Q31.5倍IQR。如果是再叠加一条业务规则比如“无人时段空调功率大于500W持续超过30分钟触发待机断电建议”。3σ法则在用电场景里也可以用但要注意数据分布。用电数据大多偏态长尾特别长直接用均值±3倍标准差会被极端值带偏。我们通常用中位数替代均值用MAD绝对中位差替代标准差做稳健的3σ检测效果要稳定很多。4.3 节能策略峰谷调度、待机管理与光伏消纳检测出来异常只是开始真正的节能要靠策略执行。我们上了几类典型策略峰谷电价调度是最简单也是用户感知最强的。很多地区晚上22点到次日8点是谷电我们把热水器、洗衣机的运行窗口统一挪到谷电时段。实现方式是策略引擎维护一个“设备-时段-电价”映射表到点了通过智能插座下发开启指令。这项策略在试点小区平均帮用户省了18%的电费。待机管理针对的是“隐形浪费”。很多家电遥控关机后其实还在待机累计下来每月可能多出几十度电。我们用智能插座实时检测功率如果设备功率低于待机阈值超过设定时间自动断电。这个逻辑用在电视、音响、显示器上效果特别好。做的时候要注意例外清单比如冰箱、路由器不能随便断电否则会把用户惹毛。光伏自消纳稍微复杂一点。光伏发电高峰在中午但家庭用电高峰在早晚我们需要判断“当前光伏余电有多少、储能电池要不要充、要不要提前给热水器加热”。我们基于气象预测和短期负荷预测做了简单的最优化如果预测下午光伏发电量高且电价处于峰段就提前开启热水器把多余光伏电转化为热能。这个策略跑了一个夏天光伏自发自用率从60%提升到了82%。4.4 别被总额骗了节能效果怎么科学评估做完策略之后最容易被挑战的问题就是“你说节能了怎么证明”直接看当月电费和去年同比最大的问题是没考虑天气、入住率、设备数量变化很容易张冠李戴。科学的评估法则是“同条件基线对比”。我们把每个月的实际用电量和基于历史数据模拟的“不执行节能策略”基线做对比。举个例子2024年6月某小区实际总用电12万度但根据天气和设备数据模拟的基线是14万度那么节电率就是(14-12)/1414.3%。这个“模拟基线”要考虑温度和湿度我当时简单做了一个线性回归模型输入是日均温度、湿度、户数和设备数输出是预测用电量。还有一个实用技巧能上A/B测试就上A/B测试。把同户型、同朝向的住户随机分成两组一组执行节能策略一组不执行连续跑一个月对比。我们在某个社区选了两栋楼做实验实验组和对照组户型比例一样结果实验组节电率9.7%这个数字才敢写进给客户的汇报里。做评估最容易犯的错是只看“电费降了”实际上电费降可能只是因为天气凉快了。5. 数据权限与可视化大屏的工程化实践有了计算能力和节能策略还得让不同角色安全地看到数据。这一节讲行列权限怎么在Java体系里落地以及大屏接口如何高效喂数据给前端。5.1 行列权限设计Java落地与开源方案能源数据的敏感度不低物业能看到一个楼栋的用电情况运营方能看到小区的汇总业主只能看自家明细电费、缴费记录这类字段连客服都不该看全。这就涉及行级权限和列级权限两个维度。行级权限解决的是“能看到哪几户”的问题。我们在Spring Boot的API层统一拦截请求通过注解声明数据范围拦截器自动拼装过滤条件。实现方式是自定义DataScope注解标记在Mapper方法上然后用MyBatis拦截器拦截SQL根据当前登录人的角色和归属机构自动追加WHERE条件比如AND house_id IN (select house_id from user_house where user_id #{userId})。这样业务代码不需要每个查询都写一遍权限逻辑。列级权限在序列化时处理。比如电费字段客服角色查询用户列表时后端返回的JSON里这一列要么脱敏显示***要么直接不输出。我们用Jackson的自定义Serializer在返回实体前检查当前用户的列权限集合动态决定序列化哪些字段。开源方案方面如果上了Hive/Spark数仓Apache Ranger是标准的行行列列权限解决方案。不过Ranger部署和配置成本不低小团队一开始不必上。我们当时的做法是API层Java拦截器管在线接口Ranger管数仓SQL查询两条线分开。真要一步到位建议直接调研RangerHive的集成方案配合Sentry或者自带权限模型能省不少自研时间。5.2 大屏接口设计Java后端如何喂数据给ECharts数据大屏是客户最直观的体验点。大屏展示通常包括实时总功率、今日累计用电、区域用电热力图、设备在线率、异常告警列表、节能排行。大屏接口的设计原则是“宁可多缓存不能慢响应”。实时指标走RedisWebSocket推送聚合指标走ClickHouse缓存。比如“实时总功率”这类数据Flink每5秒算完写入Redis后端API直接读Redis返回前端通过WebSocket订阅全程不查数据库。聚合指标我举一个“区域热力图”的例子。前端需要按“小区-楼栋”维度展示用电强度我们的后端接口设计成GET /api/v1/panel/region-heat?date2024-06-25 { code: 0, data: [ {region: A区1栋, value: 38.6}, {region: A区2栋, value: 52.1} ] }这个接口的数据从ClickHouse查一张按“日期区域”预聚合的表查询时间是毫秒级。注意不要在接口里实时做明细聚合否则大屏刷新一次就要砸一次ClickHouse并发一高就扛不住。前端拿到数据后用ECharts的heatmap或者map就可以渲染。对接过程中容易遇到的问题有两个一个是时间字段的时区问题后端返回的时间戳是UTC前端展示必须转成东八区否则图表曲线对不上另一个是数据对齐问题不同指标的时间粒度可能不一样实时功率是5秒粒度日累计是分钟粒度前端一定要按实际时间戳标注不能想当然地把每个点等距排列。6. 踩坑实录与集群部署避坑指南这个项目开发过程中踩过的坑比预想的多大部分坑在文档里查不到。这一节整理成负债清单希望读者直接跳过我们走过的弯路。6.1 小团队集群怎么起步从单机到三节点很多团队一上来就按大厂标准搭Hadoop集群结果小项目还没跑起来光运维就把人累趴了。我们当时的建议是分阶段演进。单机阶段用Docker Compose在测试机跑一套精简版包括Kafka、Flink、Hive用Derby或MySQL做元数据、TDengine、ClickHouse。单机部署的意义不是凑数而是用来开发联调和验证数据链路。组件能砍则砍别一上来就装全套HDFS、Yarn、Zookeeper那一套全家桶单机跑起来互相抢资源反而拖慢开发。生产三节点阶段主节点跑NameNode、Yarn ResourceManager、HiveServer2、Zookeeper两个从节点跑DataNode、NodeManager、Kafka、TDengine。内存分配要提前规划3节点每台32GB内存的话建议Yarn容器内存控制在20GB左右留下12GB给操作系统和独立部署的组件。踩过最大的坑是Kafka和NameNode共用一台机器磁盘IO互相干扰后来强制把Kafka的日志目录和HDFS的数据目录分到不同磁盘才解决。另一个建议是生产集群和测试集群一定要物理隔离。我们是吃过亏的测试环境跑了个大任务直接把生产Kafka的带宽挤爆导致一个多小时的消息积压。从那以后测试环境哪怕配置低一点也绝不和生产共用基础设施。6.2 典型故障与排查思路乱序、OOM、权限绕过问题一Kafka消费端重平衡导致消费抖动。现象是Flink作业频繁重启消费lag忽高忽低。排查后发现是max.poll.interval.ms设置太短消费端处理消息耗时过长被Kafka判定为死线程触发重平衡。解决办法是把max.poll.interval.ms调到5分钟同时提高Flink的并行度让单线程分摊的数据量变小。问题二Spark任务OOM。我们跑的日批量任务某一天突然全部失败报Container killed by YARN for exceeding memory limits。查看Spark UI发现某个stage的task数据倾斜一个核处理的数据量是其他核的几十倍。解决办法是给Spark SQL指定spark.sql.shuffle.partitions200并且把中间聚合类任务拆成两个stage先按天聚合再按户聚合避免单task内存爆炸。问题三MyBatis行权限拦截器误伤系统账号。我们的拦截器一开始对所有Mapper生效结果系统内部任务比如定时批量算费也被拼上了用户过滤条件查到一半数据为空。后来在DataScope注解里加了ignoreSystemtrue标志位只有明确标记的外部查询才走权限拦截内部任务一律放行。权限这块还想多说一句行权限过滤条件一定要在SQL层做不能在后端Java内存里做。有人为了省事把全表数据查出来再用stream过滤数据量一大直接内存溢出而且慢得没法看。SQL层做权限的本质是让数据库自己处理过滤既快又稳。7. Java成长为大数据的实践路线文章最后聊点实在的。很多Java工程师问过我想转大数据方向到底怎么学。我觉得与其学一堆碎片不如直接拿这类能源项目当靶子按需学习。7.1 从Java基础到大数据的四阶段路线第一阶段是Java基础强化。集合、并发、JVM内存模型、IO模型必须过关。大数据框架全是并发和网络编程堆起来的Java基础不牢看Flink源码会非常吃力。尤其要理解Java的线程模型和内存模型Kafka、Flink、Hadoop的调优到最后本质上都是在调线程和内存。第二阶段是Hadoop生态基础。理解HDFS的读写机制、Yarn的资源调度、Hive的SQL到MapReduce/Spark的转化过程。不用追求手写MapReduce但必须搞清楚数据在分布式环境下是怎么移动的数据倾斜为什么会发生reduce阶段为什么慢。第三阶段是实时计算和消息队列。Kafka的存储结构、分区机制、消费组模型Flink的事件时间、Watermark、窗口、状态、精确一次语义。这些概念光看文档不够一定要在本地环境跑通一个端到端的实时计算Demo比如Kafka流水数据经过Flink窗口聚合后写入MySQL。第四阶段是综合实战。找一个有真实数据量的场景比如家庭能源管理、电商订单分析甚至网约车轨迹清洗把设备接入、消息队列、流批计算、数据服务、权限控制全链路跑一遍。做的时候一定要用真实的数据量压测否则只会写Demo不知道线上会遇到什么问题。7.2 这个项目还能往哪里延伸能源管理平台天然有扩展场景。第一个方向是从单户走向园区或社区设备数量从几千涨到几十万对计算引擎的稳定性和成本控制要求高一个数量级。第二个方向是接入碳排放因子把用电量换算成碳排放量进而做碳足迹管理和碳减排报告这个在商业地产和政府园区里有很强的需求。第三个方向是预测能力增强在目前“事后分析”的基础上引入小时级负荷预测和光伏发电预测让节能策略从“响应式”变成“预判式”真正实现能源调度的智能化。预测算法的选型上我建议先尝试ARIMA和LightGBM这类成熟模型不要一上来就上深度神经网络。能源负荷数据有明显的周期性和趋势性先用传统模型跑通找出特征重要性再决定有没有必要引入更复杂的模型。机器学习不是越贵越好而是越准越好。做这个项目过程中我在实际操练中最大的体会是先跑通最小闭环再逐步加组件。很多团队犯的错是架构设计阶段就追求大而全结果半年过去连一条能稳定产出报表的数据链路都没有。我们当时的做法是先用KafkaFlinkMySQL搭了一条最小数据管道让大屏先亮起来再根据真实反馈迭代出TDengine、ClickHouse、Ranger这些新组件。系统是长出来的不是设计出来的。最后再分享一个小技巧无论做什么大数据项目一定要把数据质量监控当一级功能来做。可以没有炫酷的算法但不能没有“数据是否延迟、是否重复、是否乱序”的可观测性。我们在Flink里埋了一套数据质量指标每30秒输出一次lag、去重率、乱序率这些数字才是你判断链路健康度的唯一依据。数据干净了后面的优化才谈得上。
返回列表