当前位置: 首页 > news >正文

物联网数据湖架构

物联网海量数据湖分析架构(推荐实践)

┌──────────────┐
│   IoT设备端   │
└──────┬───────┘│(MQTT/HTTP)▼
┌──────────────┐
│    EMQX等     │   可选(也可设备直接接Kafka/MQ)
└──────┬───────┘│(MQTT→Kafka Bridge)▼
┌──────────────┐
│    Kafka     │   ★ 数据总线,高并发缓冲与削峰
└──────┬───────┘││(流式消费)▼
┌────────────────────────┐
│   Flink/Spark Streaming │   ★ 流/批处理,数据清洗、聚合、分桶分区、批量落盘
│   (写数据湖/OSS)      │
└──────┬───────────┬─────┘│           ││           ││(7天内热数据) │(数据湖分区归档)▼           ▼
┌──────────────┐   ┌────────────────────────────┐
│   MongoDB    │   │    OSS/S3/MinIO 数据湖区    │
│(短期热数据)│   │  Parquet/ORC分区批量归档存储│
└──────────────┘   │(如year=2025/month=05/…)   │└────────────┬───────────────┘│┌───────────────┴──────────────┐▼                              ▼Trino/Presto/StarRocks             离线分析/可视化★ 分布式SQL分析引擎直接查OSS湖区(支持中位数、P95、聚合统计)

架构分层说明与选型理由

1. 采集层

  • IoT设备端 → EMQX(可选)→ Kafka
  • 负责承接海量并发,Kafka做主消息缓冲和削峰,方便后端弹性扩容。

2. 计算与写入层

  • Flink/Spark Streaming
  • 实时消费Kafka消息,数据预处理、格式校验、异常数据隔离。
  • 批量写入MongoDB(仅7天热数据)用于短期API查询。
  • 按时间/设备等分区批量归档到OSS/数据湖(Parquet/ORC格式),实现低成本无限扩容。

3. 存储层

  • MongoDB

    • 只保存近7天热数据,满足实时接口和最新查询需求。
    • 定期自动清理过期数据,降低成本。
  • OSS/S3/MinIO(数据湖区)

    • 主存储,Parquet/ORC分区存储全部历史数据,适用于大批量聚合分析。
    • 按时间、设备等多级分区,检索效率高。

4. 分析与服务层

  • Trino/Presto/StarRocks

    • 直接用SQL连接OSS数据湖,支持max/min/avg/median/p95/窗口聚合等分析。
    • 支持多用户高并发大规模历史数据查询,完全无需再将OSS数据批量倒回MongoDB。
  • 可选:离线分析/BI可视化工具

    • 如Superset、Tableau,连接Trino等实现数据报表和大屏。

核心优势

  • 超强弹性:Kafka、Flink、OSS/数据湖全部可横向扩容。
  • 冷热分层、成本低:MongoDB只做热数据,OSS承担所有归档数据,节省高性能数据库资源。
  • 超强分析能力:Trino/Presto等支持SQL直查海量历史,聚合/分位点分析性能极佳,毫无压力。
  • 开发和运维简单:如同MyBatis查MySQL一样用SQL查数据湖,逻辑简单,技术栈成熟。

数据湖分区和存储规范举例

  • 存储格式:Parquet(列式存储,压缩高效,分析性能好)

  • 分区策略

    oss://iot-data-bucket/iot_data/year=2025/month=05/day=20/device_id=xxxx/part-xxxxx.parquet
    

    或简单时间分区+字段过滤

  • 每条数据内容

    device_idtsparam_aparam_b
    xxx0012025-05-20 10:01:2312.38.6
    xxx0022025-05-20 10:01:2415.47.8

查询范例(以Trino为例)

SELECTdate_trunc('minute', ts) AS minute,avg(param_x) AS avg_value,max(param_x) AS max_value,min(param_x) AS min_value,approx_percentile(param_x, 0.5) AS median_value,approx_percentile(param_x, 0.95) AS p95_value
FROMhive.iot_data
WHEREdevice_id = 'your_device_id'AND ts BETWEEN TIMESTAMP '2025-05-19 00:00:00'AND TIMESTAMP '2025-05-19 23:59:59'
GROUP BYdate_trunc('minute', ts)
ORDER BYminute;

常见问题解答

  • OSS数据能实时查吗?
    通常数据归档延迟可做到分钟级,Trino等SQL引擎查OSS/MinIO的数据几乎是实时的,性能远超传统数据库聚合。

  • Java应用如何查?
    和查MySQL一样,用Trino/Presto的JDBC驱动发SQL即可,不需要自研复杂代码。

  • 如果业务刚迁移,原有MongoDB接口怎么办?
    前7天热数据照常查MongoDB,历史分析走SQL数据湖即可,两者可并行平滑过渡。


补充:核心技术选型

场景推荐组件
消息中间件Kafka
流式处理Flink/Spark Streaming
热数据缓存MongoDB
数据湖/归档存储OSS/S3/MinIO + Parquet
SQL分析Trino/Presto/StarRocks
BI与报表Superset/Tableau等

相关文章:

  • 【C++】异常解析
  • YouTube视频字幕转成文章算重复内容吗?
  • 五分钟完成PolarDB替换postgresql
  • paddle ocr本地化部署进行文字识别
  • 基于Elasticsearch的搜索引擎简介
  • 为 Windows 和 Ubuntu 中设定代理服务器的详细方法
  • 区块链blog2_中心化与效率
  • 解决软件连接RabbitMQ突发System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接异常
  • VR 互动实训的显著优势​
  • 一文了解VR拍摄制作
  • 江协科技EXTI外部中断hal库实现
  • HarmonyOS开发样式布局
  • Ubuntu ping网络没有问题,但是浏览器无法访问到网络
  • 从零开始训练一个CLIP
  • Tare使用MCP|Win11安装UV
  • Milvus 从 v2.4.12 升级到 v2.5.11 的实施方案
  • FART 自动化脱壳框架简介与脱壳点的选择
  • 【Linux】守护进程
  • 人工智能100问☞第27问:神经网络与贝叶斯网络的关系?
  • 【Spring Boot后端组件】SpringMVC介绍及使用
  • 特朗普与普京就俄乌问题通话
  • 花旗回应减员传闻:持续评估人力资源战略,将为受影响的个人提供支持
  • 习近平在河南洛阳市考察调研
  • 世卫大会拒绝涉台提案,外交部:坚持一个中国原则是人心所向
  • 沧州盐碱地“逆天改命”:无用之地变良田,候鸟翔集水草丰美
  • 大风+暴雨,中央气象台双预警齐发