详解flink SQL基础(四)

文章目录

        • 1.Flink SQL介绍
        • 2.streaming SQL&watermarks使用
        • 3.窗口聚合(window aggregations)
        • 4.over aggregations
        • 5.FlinkSQL 流连接(Streaming join)
        • 6.使用MATCH_RECOGNIZE 进行模式识别和复杂事件处理
        • 7.变更记录(changelog)处理以及变更更新错误排查
        • 8.使用explain进行故障排除
        • 9.参考文档

1.Flink SQL介绍

OLTP 对比 OLAP
在这里插入图片描述
SQL查询原理:

在这里插入图片描述
视图&物化表
在这里插入图片描述
在这里插入图片描述

物化视图刷新策略:

  1. 全量刷新
    在这里插入图片描述

  2. 增量刷新
    在这里插入图片描述
    Flink SQl查询原理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • Flink SQL内部不维护物化视图,维护状态,保存分布式键值存储,会运行时优化,保存尽量小的状态

  • Flink使用incremental updates 策略,而非complete refresh 策略

  • Flink SQL不是一个数据库,是一个SQL 查询处理器(SQL Query Processor)
    在这里插入图片描述
    Flink SQL查询计划编译查询语句成为一个flink job,然后job被在flink集群上执行
    Flink SQL提供了exactly-once(完全准确的数据流,无丢失、不重复) 、at-least-once(有可能流数据重复) 确保外部系统如何存储输入输出数据到表中;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    flink exactly-once确保数据相当于ACID在单key事务

Flink SQl VS SQL database对比
在这里插入图片描述

Flink SQL常用操作命令

use catalog examples;show catalogs;use marketplace;#使用marketplace数据库show databases;show tables;describe extended `examples`.`marketplace`.`clicks`;describe clicks;  #显示表结构select * from orders where price < 20;select distinct brand from products;use catalog `sql-course_environment`; #使用catalog:sql-course_environment
use `sql-course_kafka-cluster`;  #使用数据库:sql-course_kafka-cluster#创建表
create table `small-orders` (`order_id` STRING NOT NULL,`customer_id` INT NOT NULL,`product_id` STRING NOT NULL,`price` DOUBLE NOT NULL
);#显示表结构
show create table `small-orders`;#把从orders表查询出来的数据插入small-orders中
insert into `small-orders`select * from `examples`.`marketplace`.`orders` where price < 20;

kafka 环境、clusters(集群)、topics(主题)与 schemas、Flink SQL之间的关系:

KafkaFlinkNotes
EnvironmentCatalogFlink can query and join data that are in any environments/catalogs
ClusterDatabaseFlink can query and join data that are in different clusters/databases
Topic + SchemaTableKafka topics and Flink tables are always in sync. You never need to to declare tables manually for existing topics. Creating a table in Flink creates a topic and the associated schema.

在这里插入图片描述

2.streaming SQL&watermarks使用

watermarks

  • watermarks(水印)可以标记过去的一段时间的记录,可以触发垃圾回收(GC),可以估算完整数据流信息和部分数据流信息的边界,flinkSQL依靠水印(watermarks)触发各种基于时间的操作并产生结果,知道运行时存储的数据流何时失效;支持流操作的状态管理
  • 逻辑时间通过事件中的timestamps时间戳测量
    在这里插入图片描述

Flink SQl中所有基于时间的操作都依赖水印

  • windows
  • Interval joins
  • Temporal joins
  • MATCH_RECOGNIZE(pattern matching)

watermark多source流整合过程
在这里插入图片描述
水印会为每个分区或独立的流生成水印
在这里插入图片描述
当p0继续的时候,p1已经处于空闲,可以设置idle time
在这里插入图片描述
在这里插入图片描述
watermark drift(水印偏移)会导致越来越多的部分信息被缓冲起来导致性能问题与运营困难对于flink集群运行的job;要解决这个问题就需要约束大的水印偏移,可以通过配置maxAllowedWatermarkDrift

定义watermarks考虑点:

  1. watermark delay(out-of-orderness)
  2. idle timeout
  3. max allowed watermark drift
  4. 使用timestamp

自定义水印的确定场景:

  1. 当topic数据非常少
  2. 当默认的水印处理产生过多延迟事件时,允许增加的延迟来降低延迟事件发生的可能性

必须使用watermark的场景:

Processing time(wall clock time:挂钟时间) vs event time:

使用处理时间(也称为挂钟时间)作为时间信息的来源,而非事件中存储的时间戳,那么水印就不是必需的。不过,不建议使用处理时间,因为它会引入非确定性,且可能使生成的结果难以解释。Confluent Cloud 不支持处理时间。

watermark支持流操作的状态管理:

对于批处理水印不是必须的,对于流处理工作负载,只有那些关注过去时间的流操作才需要水印。这些时间操作包括:

  • window aggregations

  • interval and temporal joins

  • sorting (by time), and any operation that involves time-based sorting, including

    • ORDER BY
    • OVER aggregations, including deduplication(去重) and top-n
    • pattern matching with MATCH_RECOGNIZE

    只使用 SELECT 和 WHERE 子句的查询不需要水印。上述列出的时间操作需要水印的原因是,所有这些操作都是有状态的,需要利用水印来确定何时可以安全地丢弃部分状态。

常规聚合(与窗口聚合相对)和常规连接(与间隔连接和时间连接相对)不使用水印,但使用时应谨慎,因为它们不仅是有状态的,还会使用无限量的状态。

时间属性(time atrribute):

​ 时间属性是一个定义了水印的时间戳列。例如:查询在进行基于时间的窗口操作,时间属性的时间戳将用于确定每个事件应分配到哪个窗口,而水印将决定每个窗口何时完成。

一个 Flink表可以有多个时间戳列。例如,一个 “订单” 表可能包含指示订单下单时间订单发货时间的时间戳列。水印只能应用于其中一个时间戳列而这个特殊的列将成为时间属性这进而意味着,所有这些时间操作只能应用于选择用于水印的那个时间戳列。

如果觉得是一种限制,可以,以不同的方式对数据进行建模。例如,将发货时间信息从 “订单” 表中分离出来,放到单独的 “发货” 表中,这会带来更大的灵活性。

  • current_watermark(时间戳):通过限制输出行数,可以在结果中上下翻页;可以有益于有关水印的问题调试,但只能交互用于append-only 表

    select user_id, url, $rowtime, current_watermark($rowtime) as wm
    from `examples`.`marketplace`.`clicks` limit 500;create table `some_clicks` (`partition_key` INT,`user_id` INT NOT NULL,`url` STRING NOT NULL,`event_time` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp'
    ) distributed by hash(`partition_key`) into 2 buckets;insert into `some_clicks`
    select1 as partition_key, user_id,url,$rowtime as event_time
    from `examples`.`marketplace`.`clicks` limit 500;
  • SOURCE_WATERMARK()

  • 定义watermark

    create table `ooo_clicks` (`user_id` INT NOT NULL,`url` STRING NOT NULL,`event_time` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp',watermark for `event_time` as `event_time` - INTERVAL '1' SECOND
    );insert into `ooo_clicks`
    selectuser_id,url,TIMESTAMPADD(SECOND, rand_integer(6), $rowtime) as event_time
    from `examples`.`marketplace`.`clicks`;with a_thousand_clicks as (select * from ooo_clicks limit 1000) 
    select count(*) from a_thousand_clicks 
    where event_time <= current_watermark(event_time);selectcount(*) as total_events,sum(case when event_time <= current_watermark(event_time) then 1 else 0 end) as late_events
    from ooo_clicks;
    

    设置水印的空闲时间:sql.tables.scan.idle-timeout

CREATE TABLE AS SELECT (CTAS):通过select创建表

-- Equivalent to the following CREATE TABLE and INSERT INTO statements.
CREATE TABLE my_ctas_table
AS SELECT id, name, age FROM source_table WHERE mod(id, 10) = 0;

flink sql 数据分配策略:

  • 无状态、顺序保留 → Forward
  • 负载均衡 → Rebalance(轮训)/Rescale(缩放分配);
  • 彻底打散 → Shuffle(随机分配);
  • 全局数据分发 → Broadcast
  • 按 Key 聚合 / 状态处理 → Key Group(哈希)(keyBy)。
  1. Forward(正向分配)
    原理:上游算子的第 i 个并行任务(Subtask)仅将数据发送到下游算子的第 i 个并行任务。
    约束:上下游算子的并行度必须相同(parallelism 一致)
    特点:数据顺序严格保留(同一条流的顺序不变),无网络 shuffle 开销,性能最优。
    适用场景:上下游算子逻辑上是 “一对一” 处理,且无需数据重分配(如简单的 map、filter后直接传递

  2. Shuffle(随机分配)
    原理:上游每个任务随机将数据发送到下游的任意任务(无固定规则)。
    特点:数据被完全打散,可能导致下游任务负载不均(极端情况下),但能打破数据局部性。
    适用场景:需要彻底打乱数据分布的场景(如批处理中的 sample 采样、随机化处理)

  3. Rebalance(轮询分配)
    原理:上游每个任务通过 “轮询”(Round-Robin)方式将数据均匀分配到下游所有任务。
    特点:能强制平衡下游任务的负载,避免数据倾斜(上游数据按顺序依次发送到下游每个任务)
    适用场景:上游数据可能存在倾斜,需要下游任务负载均衡(如 reduce 前的预处理)

  4. Rescale(缩放分配)
    原理:上游任务仅将数据发送到下游的 “部分任务”(而非全部),具体分配范围由并行度比例决定。
    例:上游并行度为 2,下游为 4,则上游任务 0 发送到下游 0、1,上游任务 1 发送到下游 2、3;
    若上游 4、下游 2,则上游 0、1 发送到下游 0,上游 2、3 发送到下游 1。
    特点:相比 Rebalance 减少网络传输范围(仅在部分任务间通信),适合上下游并行度成比例的场景。
    适用场景:需要局部负载均衡,且上下游并行度有明确比例关系(如多层 map 级联)

  5. Broadcast(广播分配)
    原理:上游每个任务将数据复制并发送到下游所有任务(下游每个任务都能收到完整数据)。
    特点:数据量会随下游并行度线性膨胀,仅适合小数据集(如配置信息、规则表)。
    适用场景:下游任务需要基于全局数据做计算(如用广播的规则表过滤流数据)。

  6. Key Group(按 Key 分组分配)
    原理:通过 keyBy() 算子指定 Key 后,Flink会将相同 Key 的数据分配到同一个下游任务(保证 “Key 一致性”)
    实现:先对 Key 哈希,映射到固定数量的 “Key Group”(默认 128 个,可配置),再将 Key Group 分配给下游任务(每个任务负责多个 Key Group)
    特点:确保相同 Key 的数据在同一任务处理,是状态一致性(如 ValueState)和窗口计算(Window)的基础。
    适用场景:需要基于 Key 做聚合(sum、reduce)、状态存储或窗口计算的场景(几乎所有有状态处理)

3.窗口聚合(window aggregations)

1.滚动窗口(tumbling window)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.跳跃窗口(hopping window)
在这里插入图片描述
3.累加窗口(accumulate window)
在这里插入图片描述
4.会话窗口(session window)
在这里插入图片描述
window table-valued functions (TVF)分类:

  1. 将表中的元素划分为窗口:
    • Tumble Windows
    • Hop Windows
    • Cumulate Windows
    • Session Windows (not supported in batch mode)
  2. 使用频次计算:
    • Window Aggregation
    • Window TopN
    • Window Join
    • Window Deduplication
4.over aggregations
SELECT product_id,price,COUNT(price) OVER w AS num_prices,AVG(price) OVER w AS avg_price
FROM `examples`.`marketplace`.`orders`
WHERE product_id < 1010
WINDOW w AS (PARTITION BY product_idORDER BY $rowtimeROWS BETWEEN 2 PRECEDING AND CURRENT ROW # 在前2行与当前行之间
);

Flink SQL 还支持将去重、Top-N 和窗口化 Top-N 查询作为 OVER 窗口的特殊情况。

5.FlinkSQL 流连接(Streaming join)

Streaming SQL -> continuous queiries;some continuous queries need to keep some state

3种SQL 操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Streaming join一直查询:
在这里插入图片描述
1.table updating
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
show changelog:显示变更记录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2. table appending
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Flink join table的记录变更主要依赖水印(Temporal join的结果)

Flink 支持传统的内连、外连、左连、右连;但是大多数这样的结果是错误的,因为与流连接方式有关;

Flink 的流处理SQL运行处理查询的方法:在任何时间点,流处理 SQL 查询的结果都将与在传统的面向批处理的数据库中对相同数据运行相同查询所得到的结果一致。

Flink 的面向流处理的运行时会保留它所需的任何状态,这样当每一行额外的输入数据被处理时,结果就可以被增量更新

错误消息如下:

XXX doesn't support consuming update and delete changes which is produced by node YYY

原因分析:这表明 XXX 是一种无法接受更新流作为输入的操作,而 YYY 是一种会生成更新流的操作。解决这类问题的一种方法是将 YYY 改为同一操作的基于时间的版本:例如,用临时连接替换常规连接,或者用窗口去重替换去重。

错误消息如下:

he window function requires the timecol is a time attribute type, but is a TIMESTAMP(3).

原因分析:提供的作为窗口划分依据的时间戳列没有关联水印

6.使用MATCH_RECOGNIZE 进行模式识别和复杂事件处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
必须根据时间属性排序

​ flink仅支持match_recognize在streaming模式下,以及输入流的排序根据输入表的时间属性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面这种模式在有界流的模式下,一旦匹配会产生一个最终的结果,但是如果是无界流,这种模式永远不会完全匹配;

要修复这种无法完全匹配模式,可以采用如下模式:
在这里插入图片描述
模式匹配的应用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Match_recognize实践考虑点:
在这里插入图片描述
MATCH_RECOGNIZE最佳实践:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.变更记录(changelog)处理以及变更更新错误排查

在这里插入图片描述
在这里插入图片描述
避免上面这种错误的最佳实践如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
变更记录模式(Changelog modes):
在这里插入图片描述
flink的2种changelog 流:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Stream change mode:
在这里插入图片描述
在这里插入图片描述

8.使用explain进行故障排除
  • flink sql语句不产生结果原因是watermarks的问题
  • 查询结果很慢,使用资源越来越多 原因是:state问题

flink explain诊断故障:
例子1:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
key-based shuffle:基于key抖动

在这里插入图片描述
中等状态(medium state):

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最佳实践
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.参考文档
  • flink资料:

    build flink application in java

    https://developer.confluent.io/courses/flink-java/overview/

    flink 101

    https://developer.confluent.io/courses/apache-flink/intro/

    apache flink SQL
    https://developer.confluent.io/courses/flink-sql/overview/

    flink-table-api-java

    https://developer.confluent.io/courses/flink-table-api-java/overview/

    flink cep 规则引擎
    https://www.liaojiayi.com/deep-dive-cep/

    Flink CEP实战
    https://www.bilibili.com/video/BV1i441127Q8/?spm_id_from=333.337.search-card.all.click&vd_source=51c993d69874e13d552c1b91dbf90aec

    https://www.bilibili.com/video/BV16Z4y1v7j4/?spm_id_from=333.337.search-card.all.click&vd_source=51c993d69874e13d552c1b91dbf90aec

    flink 官方文档

    https://nightlies.apache.org/flink/flink-docs-master/zh/

    https://nightlies.apache.org/flink/flink-docs-release-2.0/

    https://www.confluent.io/resources/all/?language=english

    Data Streaming Engineer:
    https://developer.confluent.io/certification/

    flink quick start
    https://developer.confluent.io/quickstart/flink-on-confluent-cloud/#3-create-flink-compute-pool

    flink手册 :https://developer.confluent.io/tutorials/
    ​confluent 官方github仓库地址:https://github.com/confluentinc

  • 实时计算Flink版SQL实践:

    https://www.bilibili.com/video/BV13V4y1L7Gz/?spm_id_from=333.337.search-card.all.click&vd_source=51c993d69874e13d552c1b91dbf90aec

  • Flink重分区算子解析 - StreamPartitioner

    https://blog.csdn.net/Rango_lhl/article/details/126033155

  • 流式应用flink开发框架:Apache StreamPark https://streampark.apache.org/zh-CN/

  • fink 官方B站 https://space.bilibili.com/33807709?spm_id_from=333.788.upinfo.detail.click

  • flink中文官网 https://flink-learning.org.cn

  • flink学习网:https://flink-learning.org.cn/article

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94447.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有鹿机器人:为城市描绘清洁新图景的智能使者

一、智慧清洁&#xff1a;科技赋能的环境革新每天清晨&#xff0c;当我沿着小区路径缓缓行驶&#xff0c;双激光雷达系统便开始精准测绘环境。我的专业清扫能力源自2cm精度死亡贴边技术&#xff0c;这项让同行惊叹的能力&#xff0c;可以轻松震出嵌了十年的烟头&#xff0c;彻底…

Tableau Server高危漏洞允许攻击者上传任意恶意文件

Tableau Server 存在一个严重安全漏洞&#xff0c;可能允许攻击者上传并执行恶意文件&#xff0c;最终导致系统完全沦陷。该漏洞编号为 CVE-2025-26496&#xff0c;CVSS 评分为 9.6 分&#xff0c;影响 Windows 和 Linux 平台上的多个 Tableau Server 和 Tableau Desktop 版本。…

数据结构07(Java)-- (堆,大根堆,堆排序)

前言 本文为本小白&#x1f92f;学习数据结构的笔记&#xff0c;将以算法题为导向&#xff0c;向大家更清晰的介绍数据结构相关知识&#xff08;算法题都出自&#x1f64c;B站马士兵教育——左老师的课程&#xff0c;讲的很好&#xff0c;对于想入门刷题的人很有帮助&#x1f4…

onnx入门教程(七)——如何添加 TensorRT 自定义算子

在前面的模型入门系列文章中&#xff0c;我们介绍了部署一个 PyTorch 模型到推理后端&#xff0c;如 ONNXRuntime&#xff0c;这其中可能遇到很多工程性的问题。有些可以通过创建 ONNX 节点来解决&#xff0c;该节点仍然使用后端原生的实现进行推理。而有些无法导出到后端的算法…

YggJS RButton 按钮组件 v1.0.0 使用教程

&#x1f4cb; 目录 简介核心特性快速开始安装指南基础使用主题系统高级功能API 参考最佳实践性能优化故障排除总结 &#x1f680; 简介 YggJS RButton 是一个专门为 React 应用程序设计的高性能按钮组件库。它提供了两套完整的设计主题&#xff1a;科技风主题和极简主题&…

Linux(二十)——SELinux 概述与状态切换

文章目录前言一、SELinux 概述1.1 SELinux 简介1.2 SELinux 特点1.2.1 MAC&#xff08;Mandatory Access Control&#xff09;1.2.2 RBAC&#xff08;Role-Based Access Control&#xff09;1.2.3 TE&#xff08;Type Enforcement&#xff09;1.3 SELinux 的执行模式1.4 SELinu…

Linux学习-TCP网络协议(补充)

一、TCP 头部标志位 TCP 头部包含多种标志位&#xff0c;用于控制连接建立、数据传输、连接断开等过程&#xff0c;核心标志位及作用如下&#xff1a;标志位英文全称作用SYNSynchronize Sequence Numbers请求建立连接&#xff0c;三次握手第一步发送 SYN 包ACKAcknowledgment响…

Go编写的轻量文件监控器. 可以监控终端上指定文件夹内的变化, 阻止删除,修改,新增操作. 可以用于AWD比赛或者终端应急响应

工具介绍 0RAYS-AWD-Filechecker一个用Golang编写的, 轻量级的文件监控器, 会监控指定文件夹内文件删除, 修改, 新增操作, 然后立刻告警并复原. 一开始是为AWD比赛写的, 主要是为了防止靶机的web目录被上马. 但也可以用到蓝队等场景上. 由于使用的Linux的系统调用, 仅支持Linux…

【6】MySQL 数据库基础操作

MySQL 数据库基础操作数据库操作查看数据库创建数据库删除数据库修改数据库数据表操作创建表修改表删除表数据库操作 查看数据库 查看有哪些数据库&#xff1f; 示例&#xff1a; [rootlocalhost][(none)]> show databases; -------------------- | Database |…

Android 探索APP/应用启动模式、Intent的Flag启动标志位

写在前面&#xff1a;Android APP有四种启动模式——》标准模式(Standard)、栈顶复用模式(SingleTop)、栈内复用模式(SingleTask)、单例模式(SingleInstance)&#xff0c;默认就是标准模式。启动模式决定了Activity在任务栈内的存在方式&#xff0c;影响了Back返回键Activity返…

Y9000P部署开源模型

环境信息&#xff1a; 设备&#xff1a;Y9000P GPU&#xff1a;RTX 3060 6G 系统版本&#xff1a;Ubuntu 24.04 一、下载模型 1、环境准备 1、安装工具 apt-get -y install git-lfs git lfs install apt-get install python3 python-is-python3 pip3.12 config set global.inde…

大模型入门实战 | 基于 YOLO 数据集微调 Qwen2.5-VL-3B-Instruct 的目标检测任务

大模型入门实战 | 基于 YOLO 数据集微调 Qwen2.5-VL-3B-Instruct 的目标检测任务这篇就是新手向的“保姆级”实操文。你将把 YOLO 检测数据 转成 对话式 Grounding 数据&#xff0c;用 ms-swift 做 LoRA 微调&#xff0c;再用脚本 推理 可视化。 但值得注意的是&#xff0c;一…

基于Python+MySQL实现物联网引论课程一个火警报警及应急处理系统

物联网引论课程大作业设计报告一、选题、内容及功能说明我们大作业选择的是题目三&#xff1a;一个火警报警及应急处理系统。主要需要实现四个功能&#xff1a;感知环境温度&#xff0c;当环境温度超过阈值&#xff0c;自动触发报警&#xff1a;终端 led 以固定频率闪烁&#x…

基于印染数据的可视化系统设计与实现

标题:基于印染数据的可视化系统设计与实现内容:1.摘要 随着印染行业的快速发展&#xff0c;印染数据呈现爆发式增长。为了更好地管理和分析这些数据&#xff0c;提高印染生产的效率和质量&#xff0c;本研究旨在设计并实现一个基于印染数据的可视化系统。通过收集印染生产过程中…

实验1 第一个微信小程序

实验1 第一个微信小程序一、实验目标二、实验步骤1. 自动生成小程序2. 手动创建小程序三、程序运行结果四、问题总结与体会chunk的博客地址一、实验目标 1、学习使用快速启动模板创建小程序的方法&#xff1b; 2、学习不使用模板手动创建小程序的方法。 二、实验步骤 1. 自…

(计算机网络)JWT三部分及 Signature 作用

JWT&#xff08;JSON Web Token&#xff09;是一种用于 无状态认证 的轻量级令牌&#xff0c;广泛用于分布式系统、单页应用&#xff08;SPA&#xff09;和移动端登录。JWT 结构概览JWT 由 三部分组成&#xff0c;用 . 分隔&#xff1a;xxxxx.yyyyy.zzzzz Header&#xff08;头…

LangGraph

LangGraph 是由 LangChain 团队开发的开源框架&#xff0c;专为构建​​复杂、有状态、多主体&#xff08;Multi-Agent&#xff09;的 LLM 应用​​而设计。它通过​​图结构&#xff08;Graph&#xff09;​​ 组织工作流&#xff0c;支持循环逻辑、动态分支、状态持久化和人工…

STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---MQTT篇(三)

一、前言本篇文章通过发送AT指令&#xff0c;与云平台建立通讯&#xff1a;1.创建云平台2.烧录AT固件3.MQTT订阅&#xff08;本篇&#xff09;4.单片机代码编写5.微信小程序&#xff08;下载微信开发者工具即可使用&#xff09;二、AT指令集介绍AT指令是一种文本序列&#xff0…

Apache Ozone 2.0.0集群部署

单机部署参考&#xff1a;Apache Ozone 介绍与部署使用(最新版2.0.0)-CSDN博客 安装部署 官方参考&#xff1a;Documentation for Apache Ozone 准备环境 环境准备参考&#xff1a;Linux环境下Hadoop3.4.0集群部署-CSDN博客 1->4-b 参考&#xff1a;Apache Ozone 介绍与部…

【计算机网络 | 第9篇】信道的极限容量

文章目录探秘信道的极限容量&#xff1a;从奈氏准则到香农定理一、信道极限容量的基本概念&#x1f914;二、奈氏准则&#xff1a;无噪声情况下的码元速率限制&#x1f426;‍&#x1f525;&#xff08;一&#xff09;带宽与信号传输的关系&#xff08;二&#xff09;码间串扰问…