Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
收藏
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
收藏
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 平台架构
  • 技术选型
  • 开发脚手架
  • UI规范
  • 开发规范
  • 代码分支管理模型
  • 需求分析与管理
  • 权限设计
  • 树形组织设计
  • 协议设计
  • 指令交互
  • OTA
  • 规则引擎
  • 数据流转
  • 报告生成与导出
  • 监控设备接入
  • 时序数据库
  • 平台监控
  • 云⛈
  • 接口设计
  • 安全传输
  • CI&CD
  • 缓存
  • 消息处理引擎
  • 性能调优🔥
  • 线上事故🔥
  • 混合式开发记录
  • 推送服务
  • 机器人通信协议
  • 数据分析
    • 🌟 背景介绍
    • 🔍 Flink & ClickHouse 各自的特点
      • 🌊 Apache Flink:实时流处理引擎
      • 🏆 ClickHouse:高性能列式数据库
    • 💡 为什么在物联网领域适用?
    • ⚙️ 实现细节
    • ⚠️ Flink + ClickHouse 结合的注意事项
    • ✍️ 示例代码
      • 1️⃣ Flink 消费 Kafka 并写入 ClickHouse
      • 2️⃣ ClickHouse 表结构
    • 😆 鲁迅曾说......
  • flink模板工程
  • 实时调度
  • 机器人模块化设计
  • STM32入门
  • 开发日志
Jorgen
2024-12-28
目录
🌟 背景介绍
🔍 Flink & ClickHouse 各自的特点
🌊 Apache Flink:实时流处理引擎
🏆 ClickHouse:高性能列式数据库
💡 为什么在物联网领域适用?
⚙️ 实现细节
⚠️ Flink + ClickHouse 结合的注意事项
✍️ 示例代码
1️⃣ Flink 消费 Kafka 并写入 ClickHouse
2️⃣ ClickHouse 表结构
😆 鲁迅曾说......

数据分析

🚀 Flink + ClickHouse:物联网实时数据处理的黄金搭档

# 🌟 背景介绍

在物联网(IoT)领域,设备数据源源不断地产生,数据量大、时效性高,如何高效处理、存储并快速查询,成了每个技术团队必须面对的问题。💡

在这片数据的海洋里,我们找到了 Flink + ClickHouse 这对黄金搭档:

  • Apache Flink:流处理神器,能实时计算、处理复杂事件。
  • ClickHouse:高性能列式数据库,适合高吞吐、实时查询。

Flink 负责数据流式处理,ClickHouse 负责高效存储和查询。两者结合,能让 IoT 数据处理更丝滑、更高效!🎯


# 🔍 Flink & ClickHouse 各自的特点

# 🌊 Apache Flink:实时流处理引擎

Flink 是一款分布式流处理框架,专注于低延迟、高吞吐的流式计算。它的主要特点包括:

✅ Exactly-once 语义:保证数据不会重复处理,也不会丢失。

✅ 事件时间(Event Time)支持:可以基于事件的发生时间而不是系统时间进行计算。

✅ 强大的窗口机制:支持滚动窗口、滑动窗口、会话窗口等,适用于各种场景。

✅ 状态管理:高效的状态存储和恢复,适合处理有状态的流计算。

✅ 丰富的连接器:支持 Kafka、MySQL、ClickHouse、Elasticsearch 等多种数据源和目标。

相比于 Spark Streaming,Flink 处理真正的流数据,而 Spark Streaming 采用微批(Micro-Batch)模式,延迟较高。


# 🏆 ClickHouse:高性能列式数据库

ClickHouse 是一款专为OLAP(在线分析处理)优化的列式存储数据库,具备以下优势:

✅ 列式存储:数据按列存储,查询时只读取相关列,大幅减少 IO。

✅ 极致压缩:支持多种高效压缩算法,数据占用更少存储空间。

✅ MergeTree 引擎:支持自动数据合并、分区、索引优化,提高查询效率。

✅ 高并发查询:适合大规模数据分析,查询速度远超传统关系型数据库。

✅ 分布式架构:可以横向扩展,适用于 PB 级数据存储和查询。

与 Elasticsearch 相比,ClickHouse 在结构化数据分析上更快,适用于 BI 和报表查询,而 Elasticsearch 更擅长全文搜索和非结构化数据分析。


# 💡 为什么在物联网领域适用?

  1. 数据量大:成千上万台设备,每秒成百上千条数据,传统架构扛不住。
  2. 数据时效性要求高:设备状态、异常报警、传感器数据,必须实时处理,不能等!⏳
  3. 数据查询需求复杂:既要支持实时流式计算(Flink),也要支持历史数据分析(ClickHouse)。

Flink 处理实时数据流,ClickHouse 进行 OLAP 分析,完美适配 IoT 业务需求!🎯


# ⚙️ 实现细节

我们来拆解一个典型的数据处理流程:

  1. 数据源(IoT 设备)👉 MQTT / Kafka 采集数据
  2. Flink 处理:
    • 数据清洗(去重、格式化、异常处理)
    • 计算聚合(设备状态、流量统计、告警检测)
  3. 写入 ClickHouse:
    • 采用 MergeTree 表引擎,提高查询效率
    • 利用 Materialized View 预计算,提高响应速度
  4. 数据查询 & 可视化:
    • Grafana / Superset 直接查询 ClickHouse,实时展示设备状态📊

架构示意图:

   +-------------+      +----------+      +-------------+      +------------+
   |  IoT 设备   | ---> |    MQ    | ---> |   Flink     | ---> | ClickHouse |
   +-------------+      +----------+      +-------------+      +------------+
1
2
3

📊 实测数据:

  • 50台机器人,每秒60条数据上报
  • 存量数据约2GB,大约4亿条
  • 每条消息0.5KB,10分钟后能追上消费速度
  • ClickHouse 开启压缩后,磁盘使用比消息队列减少 3/4
  • ClickHouse 结合 S3,可进一步优化存储,减少磁盘占用,降低成本 💰

# ⚠️ Flink + ClickHouse 结合的注意事项

✅ 批量写入 ClickHouse:避免单条插入,使用 max_insert_block_size 调优。

✅ 数据分区策略:合理选择分区键,提高查询性能。

✅ 数据聚合:使用 ClickHouse Materialized View 预计算,提高查询效率。

✅ Flink Checkpoint:确保数据处理的可靠性,防止数据丢失。

✅ ClickHouse 连接池:优化 jdbc:clickhouse 连接池,提高吞吐量。


# ✍️ 示例代码

# 1️⃣ Flink 消费 Kafka 并写入 ClickHouse

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

Properties props = new Properties();
props.setProperty("bootstrap.servers", "kafka-broker:9092");
props.setProperty("group.id", "flink-iot-group");

FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>(
        "iot_topic",
        new SimpleStringSchema(),
        props);

DataStream<String> stream = env.addSource(consumer);

DataStream<IoTData> parsedStream = stream.map(json -> parseIoTData(json));

parsedStream.addSink(new ClickHouseSink("jdbc:clickhouse://clickhouse-server:8123/iot_db"));

env.execute("IoT Flink to ClickHouse");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 2️⃣ ClickHouse 表结构

CREATE TABLE iot_data (
    device_id String,
    temperature Float32,
    humidity Float32,
    timestamp DateTime
) ENGINE = MergeTree()
ORDER BY (device_id, timestamp);
1
2
3
4
5
6
7

# 😆 鲁迅曾说......

"数据如流水,处理需及时。"

luxun

#Apache Flink#ClickHouse#数据分析
上次更新: 2025/03/09, 15:45:50
机器人通信协议
flink模板工程

← 机器人通信协议 flink模板工程→

最近更新
01
STM32入门
03-09
02
ADB调试
03-09
03
微信小程序学习记录
02-09
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式