Flink 流处理框架的核心特性
文章目录
- 事件时间支持
- Flink状态编程
- 一、状态的类型
- 1. 托管状态(Managed State)
- 2. 原始状态(Raw State)
- 二、状态的管理和容错
- Flink端到端的一致性
- 1、检查点机制
- 2、幂等
- 3、事务
- 水位线
- 窗口操作
- 1、窗口类型
- 2、窗口操作的时间语义
- 侧出流
- 容错机制
- 双流Join
- Regular Joins
- Interval Joins
- Temporal Joins
- Lookup Join
- 数据处理流程解析
- 一、ODS 数据采集
- 二、DIM 维度层处理
- 三、DWD 事实表准备
- 四、DWS 汇总表的抽取以及轻度聚合
- 五、ADS 分析和可视化操作
标签:状态编程、端到端的一致性、日志分流、测出流、精准一次性、事务、隔离级别、容错、窗口、水位线、双流Join 、分布式流处理、事件事件支持、支持批处理和流处理统一编程模型
事件时间支持
说明:事件时间是指事件在其产生的源头所发生的时间,这个时间通常会被编码到事件数据中。在流计算中,使用事件时间语义时,计算引擎会根据事件的时间戳来对事件进行排序和处理,而不是按照事件进入计算系统的时间(处理时间)或进入数据源的时间(摄入时间)。
应用场景:在金融交易系统中,处理交易记录时,即使某些交易记录由于网络问题晚到,Flink 也能根据交易发生的实际时间进行统计和分析,保证数据的准确性。
Flink状态编程
在流处理中,状态是指在处理过程中需要记住的信息。由于流数据是持续不断的,很多时候我们需要根据历史数据来处理当前数据,这就需要使用状态来存储历史信息。例如,在计算一段时间内的用户点击量时,需要记录每个用户的点击次数,这个点击次数就是一个状态
一、状态的类型
1. 托管状态(Managed State)
由 Flink 框架管理的状态,Flink 会自动进行状态的存储、恢复和内存管理等操作。托管状态又分为两种:
-
键控状态(Keyed State)
与特定的键(
key
)关联,只能在KeyedStream
上使用。
Flink 会根据键将数据分发到不同的并行实例上,并且每个键的状态是唯一的。这意味着在不同的并行实例中,相同键的状态是共享的,并且可以被正确地更新和访问。
例如,对于不同用户的最后访问日期,Flink 会根据用户 ID 这个键来管理每个用户的状态,确保每个用户的状态是一致的。键控状态可以细分为以下几种类型:
- ValueState:存储单个值。例如,记录每个用户的最新登录时间。
- ListState:存储一个列表。比如,存储每个用户最近的 10 次操作记录。
- ReducingState:存储经过归约操作后的值。例如,计算每个用户的累计消费金额。
- AggregatingState:与
ReducingState
类似,但支持更复杂的聚合操作。 - MapState:存储键值对的映射。例如,存储每个用户的属性信息。
-
算子状态(Operator State):与算子的实例关联,而不是与键关联。算子状态在所有并行实例之间共享,常用于 Source 或 Sink 等算子。例如,在 Kafka 连接器中,使用算子状态来记录每个分区的消费偏移量。
2. 原始状态(Raw State)
由用户自行管理的状态,Flink 只提供存储空间,不负责状态的序列化和反序列化等操作。原始状态通常用于实现自定义的状态管理逻辑,但使用起来相对复杂,一般情况下推荐使用托管状态。
二、状态的管理和容错
Flink 提供了强大的状态管理和容错机制,主要通过以下方式实现:
- 检查点(Checkpointing):定期将状态的快照保存到持久化存储中,当发生故障时,可以从最近的检查点恢复状态。
- 保存点(Savepoints):手动触发的状态快照,用于手动备份和恢复状态,通常用于升级或维护 Flink 应用程序。
- 状态后端(State Backends):负责管理状态的存储和访问,Flink 提供了多种状态后端,如 MemoryStateBackend、FsStateBackend 和 RocksDBStateBackend 等,可以根据不同的需求选择合适的状态后端。
Flink端到端的一致性
端到端的一致性意味着在整个流处理应用程序中,从数据的产生源头(如消息队列)开始,经过 Flink 的处理,到最终将结果写入外部存储系统(如数据库、文件系统),数据的处理结果就像在没有任何故障发生的情况下一样准确。也就是说,无论在处理过程中遇到什么故障(如节点崩溃、网络中断等),系统都能保证最终结果的一致性。
最多一次(At-Most-Once)
- 特点:数据可能会丢失,但不会重复处理。也就是说,每个数据记录最多只会被处理一次。这种级别通常适用于对数据丢失不太敏感的场景,如实时监控数据。
- 实现方式:在这种模式下,Flink 不会进行检查点操作,也不会保证数据的可靠传输和处理。
至少一次(At-Least-Once)
- 特点:数据不会丢失,但可能会重复处理。也就是说,每个数据记录至少会被处理一次。这种级别是 Flink 的默认一致性级别,适用于大多数对数据丢失敏感,但对数据重复处理不太敏感的场景,如日志分析。
- 实现方式:通过启用检查点机制,Flink 可以在发生故障时从最近的检查点恢复状态,继续处理数据,从而保证数据不会丢失。但由于可能会重复处理部分数据,因此会出现数据重复的情况。
精确一次(Exactly-Once)
- 特点:数据只会被处理一次,既不会丢失也不会重复处理。这种级别是最严格的一致性级别,适用于对数据准确性要求极高的场景,如金融交易处理。
- 实现方式:要实现精确一次的一致性,需要同时使用检查点机制和两阶段提交协议。Flink 会在检查点的基础上,通过两阶段提交协议确保数据在写入外部系统时的一致性。
Source端:起码提供可重置偏移量(数据可重放的能力)
Tranform端:检查点机制
Sink端:幂等,事务两阶段提交协议(2PC)
1、检查点机制
Flink 检查点机制的核心是定期对分布式流处理程序的状态进行快照,并将这些快照保存到持久化存储中。当系统出现故障(如节点崩溃、网络中断等)时,Flink 可以利用最近一次成功的检查点将程序的状态恢复到故障发生前的状态,然后从该状态继续处理数据,从而保证数据处理的一致性和容错性。
配置检查点参数
- 检查点间隔:通过
enableCheckpointing(long interval)
方法设置检查点的时间间隔,即每隔多长时间触发一次检查点。 - 检查点模式:通过
setCheckpointingMode(CheckpointingMode mode)
方法设置检查点的模式,支持EXACTLY_ONCE
(精确一次)和AT_LEAST_ONCE
(至少一次)两种模式。 - 检查点超时时间:通过
setCheckpointTimeout(long timeout)
方法设置检查点的超时时间,如果在规定时间内检查点没有完成,则会被视为失败。 - 最大并发检查点数:通过
setMaxConcurrentCheckpoints(int maxConcurrentCheckpoints)
方法设置最大并发检查点数,即允许同时进行的检查点数量。
2、幂等
-
定义:幂等是指一个操作执行多次所产生的结果与执行一次的结果相同。也就是说,无论该操作被重复执行多少次,对系统的影响都只相当于执行了一次。在 Flink 中,可以通过在数据目的地实现幂等写入逻辑,确保即使在故障恢复后重复写入相同的数据,也不会对最终结果产生影响。
-
不同场景下实现幂等的常见方法
数据库操作:唯一索引、乐观锁
接口服务:Token 机制、状态机
3、事务
-
定义:事务是由一系列数据库操作组成的逻辑单元,这些操作要么全部成功执行,要么全部不执行,以保证数据库的一致性。
-
特性(ACID)
原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会存在部分操作成功、部分操作失败的情况。
一致性(Consistency):事务执行前后,数据库的完整性约束不会被破坏,数据从一个一致状态转换到另一个一致状态。
隔离性(Isolation):多个事务并发执行时,每个事务都感觉不到其他事务的存在,就好像它们是在独立执行一样。
持久性(Durability):一旦事务提交成功,它对数据库所做的修改就会永久保存下来,即使系统出现故障也不会丢失。
水位线
- 事件时间:指事件实际发生的时间,是事件自带的时间属性。在流处理场景中,事件产生的时间往往早于其被处理的时间,并且可能由于网络延迟等原因导致事件到达顺序与实际发生顺序不一致,即乱序到达。
- 逻辑时钟:是一种在分布式系统中用于确定事件顺序的机制。在流处理框架(如 Flink)中,逻辑时钟与事件时间紧密相关,它帮助系统理解事件的先后顺序。水位线可以看作是逻辑时钟的一种体现形式,它基于事件时间来推进,用于标记当前系统认为已经接收到了某个时间点之前的所有数据。
- 水位线:是事件时间语义中的关键概念。它是一个时间戳,用于表示到某个时间点为止,流中所有小于该时间戳的事件都已经到达。当水位线超过窗口的结束时间时,就可以认为窗口已经收集到了所有应该属于该窗口的数据,从而触发窗口计算。水位线的推进是依据事件时间和乱序情况来确定的,它使得流处理系统在处理乱序数据时仍能保证计算结果的准确性。
水位线的两种方式
单调递增
- 定义:单调递增的水位线是有界乱序的一种特殊情况,其乱序程度为 0。在这种情况下,事件严格按照时间戳顺序到达,不存在乱序的情况。单调递增是:有界乱序的一种特殊情况(乱序程度0)
- 适用场景:适用于数据按照时间顺序有序到达的场景,例如某些实时监控系统,数据从传感器按时间顺序依次发送,不会出现乱序的情况。
有界乱序
- 定义:有界乱序表示事件的乱序程度是有限的,即事件的时间戳虽然可能乱序,但最大的乱序时间是可确定的。在这种情况下,需要根据允许的最大乱序时间来生成水位线。
- 适用场景:适用于大多数实际的流处理场景,因为在网络传输等情况下,数据乱序是常见的,但乱序程度通常是有限的。例如在电商订单处理系统中,订单事件可能由于网络原因出现一定程度的乱序,但不会无限期地延迟到达。
窗口操作
窗口操作是 Apache Flink 流处理框架中非常重要的特性,它允许用户对无界的数据流进行有限的分组和聚合操作。由于流数据是持续不断且无界的,很难对整个数据流进行处理,窗口操作可以将数据流划分为有限大小的 “桶”,在每个桶上进行各种计算
- 窗口(Window):是一种对无限流进行有限分组的抽象概念,将流数据按照一定的规则划分成多个有限大小的集合,每个集合就是一个窗口。
- 窗口分配器(Window Assigner):负责将流中的元素分配到一个或多个窗口中。常见的窗口分配器有时间窗口分配器和计数窗口分配器等。
- 窗口函数(Window Function):在窗口分配好元素后,窗口函数用于对每个窗口中的元素进行计算,例如求和、计数、求平均值等。
1、窗口类型
- 滚动窗口(TUMBLE) #
- 滑动窗口(HOP) #
- 累积窗口(CUMULATE) #
- 会话窗口(SESSION) #
2、窗口操作的时间语义
- 处理时间(Processing Time):基于系统时钟来定义窗口,即元素进入 Flink 系统的时间。处理时间不考虑事件的实际发生时间,实现简单,但在处理乱序事件时可能会导致结果不准确。
- 事件时间(Event Time):基于事件本身携带的时间戳来定义窗口,能够处理乱序事件,保证结果的准确性。在使用事件时间时,需要为流中的元素分配时间戳,并使用水位线(Watermark)来处理乱序事件。
- 摄入时间(Ingestion Time):是事件进入 Flink 数据源的时间,介于处理时间和事件时间之间。摄入时间由系统自动分配时间戳,不需要用户手动指定,但处理乱序事件的能力不如事件时间。
侧出流
侧输出流允许你在处理流数据时,将一部分特定的数据从主流中分离出来,发送到一个或多个独立的输出流中。这些侧输出流与主流相互独立,你可以对它们进行不同的处理,例如将异常数据、迟到数据等分离出来进行单独处理。
// 定义侧出流标签
OutputTag<String> dirtyTag = new OutputTag<String>("dirtyTag"){};、
// 如果转换出异常 将脏数据放到输出流
ctx.output(dirtyTag, value);
使用场景
- 处理迟到数据:在使用事件时间语义时,可能会有部分数据迟到。可以将这些迟到的数据通过侧输出流分离出来,进行单独的处理或分析。
- 异常数据处理:在数据处理过程中,可能会遇到一些不符合预期的数据,如格式错误、超出范围的值等。将这些异常数据发送到侧输出流,避免影响主流数据的处理。
- 多维度数据分析:将不同类型的数据分别发送到不同的侧输出流,以便进行不同维度的数据分析。
容错机制
- 特性说明:Flink 的容错机制基于检查点和状态后端。检查点会定期对应用程序的状态进行快照,并将其保存到持久化存储中。当发生故障时,Flink 可以从最近的检查点恢复状态,继续处理数据。状态后端负责管理状态的存储和访问,Flink 提供了多种状态后端,如
MemoryStateBackend
、FsStateBackend
和RocksDBStateBackend
等,用户可以根据不同的需求选择合适的状态后端。 - 应用场景:在大规模数据处理场景中,节点故障是常见的问题。Flink 的容错机制可以确保在节点故障时,数据处理不会中断,保证系统的稳定性和可靠性。
KafkaSink: 向Kafka主题中写入数据,也可以保证写入的精准一次性,需要做如下操作
Flink-1.20官方说明:Kafka | Apache Flink
KafkaSink
总共支持三种不同的语义保证(DeliveryGuarantee
)。对于DeliveryGuarantee.AT_LEAST_ONCE
和DeliveryGuarantee.EXACTLY_ONCE
,Flink checkpoint 必须启用。默认情况下KafkaSink
使用DeliveryGuarantee.NONE
。 以下是对不同语义保证的解释:
DeliveryGuarantee.NONE
不提供任何保证:消息有可能会因 Kafka broker 的原因发生丢失或因 Flink 的故障发生重复。DeliveryGuarantee.AT_LEAST_ONCE
: sink 在 checkpoint 时会等待 Kafka 缓冲区中的数据全部被 Kafka producer 确认。消息不会因 Kafka broker 端发生的事件而丢失,但可能会在 Flink 重启时重复,因为 Flink 会重新处理旧数据。DeliveryGuarantee.EXACTLY_ONCE
: 该模式下,Kafka sink 会将所有数据通过在 checkpoint 时提交的事务写入。因此,如果 consumer 只读取已提交的数据(参见 Kafka consumer 配置isolation.level
),在 Flink 发生重启时不会发生数据重复。然而这会使数据在 checkpoint 完成时才会可见,因此请按需调整 checkpoint 的间隔。请确认事务 ID 的前缀(transactionIdPrefix)对不同的应用是唯一的,以保证不同作业的事务 不会互相影响!此外,强烈建议将 Kafka 的事务超时时间调整至远大于 checkpoint 最大间隔 + 最大重启时间,否则 Kafka 对未提交事务的过期处理会导致数据丢失。
-
开启检查点
-
配置生产者消费一次性
.setDeliveryGuarantee(DeliveryGuarantee.EXACTLY_ONCE)
-
设置事务ID前缀保证对不同的应用是唯一的
.setTransactionalIdPrefix("dwd_base_log_")
-
设置事务超时时间 (检查点超时时间 < 事务的超时时间 <= 事务的最大超时时间)
.setProperty(ProducerConfig.TRANSACTION_TIMEOUT_CONFIG, 15*60*1000 + "")
-
在消费端,需要设置消费的隔离级别为读已提交(默认为读为提交:预提交的数据也能读到)
.setProperty(ConsumerConfig.ISOLATION_LEVEL_CONFIG, "read_committed")
双流Join
Flink官网:Join
Flink SQL支持对动态表进行复杂而灵活的连接操作。 为了处理不同的场景,需要多种查询语义,因此有几种不同类型的 Join。
默认情况下,joins 的顺序是没有优化的。表的 join 顺序是在
FROM
从句指定的。可以通过把更新频率最低的表放在第一个、频率最高的放在最后这种方式来微调 join 查询的性能。需要确保表的顺序不会产生笛卡尔积,因为不支持这样的操作并且会导致查询失败。
Regular Joins
Regular join 是最通用的 join 类型。在这种 join 下,join 两侧表的任何新记录或变更都是可见的,并会影响整个 join 的结果。 例如:如果左边有一条新纪录,在 Product.id
相等的情况下,它将和右边表的之前和之后的所有记录进行 join。
Interval Joins
返回一个符合 join 条件和时间限制的简单笛卡尔积。Interval join 需要至少一个 equi-join 条件和一个 join 两边都包含的时间限定 join 条件。范围判断可以定义成就像一个条件(<, <=, >=, >),也可以是一个 BETWEEN 条件,或者两边表的一个相同类型(即:处理时间 或 事件时间)的时间属性 的等式判断。
Temporal Joins
时态表(Temporal table)是一个随时间变化的表:在 Flink 中被称为动态表。时态表中的行与一个或多个时间段相关联,所有 Flink 中的表都是时态的(Temporal)。 时态表包含一个或多个版本的表快照,它可以是一个变化的历史表,跟踪变化(例如,数据库变化日志,包含所有快照)或一个变化的维度表,也可以是一个将变更物化的维表(例如,存放最终快照的数据表)。
Lookup Join
lookup join 通常用于使用从外部系统查询的数据来丰富表。join 要求一个表具有处理时间属性,另一个表由查找源连接器(lookup source connnector)支持。
lookup join 和上面的 处理时间 Temporal Join 语法相同,右表使用查找源连接器支持。
数据处理流程解析
重要是看业务需求,以下仅供参考
一、ODS 数据采集
日志数据采集
- Flume 组件:Flume 是一个分布式、可靠且高可用的海量日志采集、聚合和传输的系统,它支持自定义 Source、Channel 和 Sink。不过,需要注意的是,Flume 已于 2024 - 10 - 10 停止维护 。除了 Flume,也可以使用开源日志收集器 Fluentd ,Fluentd 具有轻量级、高性能、可扩展性强等优点,能方便地将不同来源的日志数据收集并发送到指定的目的地。
业务数据采集
- Maxwell:Maxwell 是一个用于从 MySQL 数据库的 binlog 中读取数据的工具。它可以实时捕获数据库的变更,并将这些变更以 JSON 格式输出。但 Maxwell 本身不具备将 JSON 格式的数据封装为字符串的功能,在实际使用中,可能需要在后续处理环节进行相应的转换操作。
二、DIM 维度层处理
此层的主要目标是将业务数据库维度表的变化实时同步到数据仓库。具体实现步骤如下:
- 配置判断:在配置表中配置相关信息,以此判断哪些表属于维度表。可以使用 Flink CDC(Change Data Capture)来捕获业务数据库中维度表的变更数据。Flink CDC 能够实时监测数据库的变化,并将变更数据以流的形式输出。
- 广播流的使用:将配置信息以广播流的形式发送到各个算子。广播流可以确保每个并行实例都能获取到相同的配置信息。
- 主流数据处理:主流数据在处理过程中,根据表名从广播流中获取对应的配置信息,进而判断该表是否为维度表,并进行相应的处理。
三、DWD 事实表准备
流量域
- 日志分流:对采集到的日志数据进行分流处理,根据不同的业务需求将日志数据划分到不同的流中,例如按照页面浏览、点击事件等进行分类。
交易域
- Flink SQL 实现连接:在使用 Flink SQL 进行普通内外连接时,参与连接的表默认会维护一个状态,并且在默认情况下这个状态永远不会失效。需要根据传输延迟和业务滞后的关系,合理设置状态的保留时间。
- 左外连接的回撤流问题:当进行左外连接时,如果左表数据先到,右表数据后到,可能会产生回撤流。例如,会产生 3 条数据(包含原始插入、回撤、重新插入)。当将这些数据发送到 Kafka 主题时,会记录这三条数据,因此需要进行空数据处理和去重操作,以保证数据的准确性。
- 连接方式的选择:普通内外连接在关联维度时,时间控制不够灵活。而 Lookup Join 是左表驱动的连接方式,能更好地控制连接的时间和数据量。
工具域、互动域、用户域
这些域的事实表准备可以通过 DataStream API 或 SQL 来实现。DataStream API 提供了更细粒度的控制,适合处理复杂的业务逻辑;而 SQL 则更简洁,适合快速实现简单的业务需求。
四、DWS 汇总表的抽取以及轻度聚合
此层的主要目的是为 ADS 层提供服务,具体步骤如下:
- 指标梳理:列出需要统计的指标,将统计周期、粒度、业务过程相同的指标放在一张汇总表进行处理,这就是汇总表的抽取过程。
- 数据处理与聚合:使用 Flink SQL 或 Flink API 读取数据并创建动态表,指定 waterMark 以处理乱序数据,提取事件时间字段。然后进行数据处理、分组、开窗、聚合计算等操作,最后将结果写入 Doris 数据库。
- 数据一致性保证:在往数据库写数据时,需要保证数据的一致性。不同的数据库可以采用不同的策略:
- HBase:可以利用 HBase 的特性实现幂等写入,确保相同的数据多次写入不会产生重复记录。
- Kafka:使用事务机制来保证数据的一致性,确保在出现故障时数据不会丢失或重复。
- Doris:Doris 的 union 表可以实现幂等写入,避免数据重复。
- 去重处理
- 状态 + 定时器:使用状态来记录已经处理过的数据,结合定时器来控制状态的失效时间。这种方法失效性较差,但不会出现数据膨胀的问题。
- 状态 + 抵消:通过状态记录数据,并在合适的时候进行抵消操作,以达到去重的目的。
- 维度关联
- 基本维度关联:可以使用旁路缓存 Redis 来存储维度数据,提高查询效率。同时,支持异步 IO操作数据库,通过异步编排对象来实现异步查询,减少等待时间,提高系统的吞吐量。
五、ADS 分析和可视化操作
ADS 层主要用于数据分析和可视化展示。可以使用 Sugar 等工具来实现数据分析和可视化操作。Sugar 可以帮助用户快速构建数据可视化界面,通过图表、报表等形式直观地展示数据分析结果,为业务决策提供支持。
相关文章:
Flink 流处理框架的核心特性
文章目录 事件时间支持Flink状态编程一、状态的类型1. 托管状态(Managed State)2. 原始状态(Raw State) 二、状态的管理和容错 Flink端到端的一致性1、检查点机制2、幂等3、事务 水位线窗口操作1、窗口类型2、窗口操作的时间语义 …...
蓝桥杯之AT24C02的页写页读
一、原理: 1、页写:一次性向AT24C02里的多个数据存储单元地址写入多个数据 (1)在AT24C02的页写模式下,每次写入数据后,存储单元地址会自动加1。 (2)一页有8个数据存储单元ÿ…...
计算机二级web易错点(7)-选择题
在 JavaScript 中,substr() 方法用于从字符串中提取子字符串。它接受两个参数,第一个参数表示开始提取的位置(索引从 0 开始),第二个参数表示要提取的字符数量。 在代码 var str"abcdefgh"; alert(str.subs…...
WordPress子主题插件 Child Theme Configurator
一、插件介绍 Child Theme Configurator 是一款强大的 WordPress 插件,专为创建和管理子主题(Child Theme)而设计。使用子主题可以安全地自定义 WordPress 站点,而不会影响原主题(Parent Theme),同时确保主题更新时不会丢失修改。 该插件适用于初学者和高级开发者,提…...
[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]
常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接; /proc/pid…...
基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
ElasticSearch 可观测性最佳实践
ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别(大数据时代)的数据。ES 也使用 Java 开…...
Java----正则表达式的学习
正则表达式可以检验字符串是否满足一定规则,并用来校验数据格式的合法性。 在一段文本当中查找满足需求的内容: import java.math.BigDecimal; import java.math.BigInteger; import java.util.Random;import static java.lang.Math.abs; import static…...
为何AI系统比以往任何时候都更需要红队测试
AI 系统已深度融入现代生活,但并非无懈可击。红队测试作为一项关键技术,正通过系统性地挖掘 AI 漏洞,显著提升其安全性与可靠性。随着人工智能技术的快速迭代,这种全面测试的需求愈发迫切,不仅能防范潜在危害ÿ…...
ElementPlus 快速入门
目录 前言 为什么要学习 ElementPlus? 正文 步骤 1 创建 一个工程化的vue 项目 2 安装 element-Plus :Form 表单 | Element Plus 1 点击 当前界面的指南 2 点击左边菜单栏上的安装,选择包管理器 3 运行该命令 demo(案例1 ) 步骤 …...
vue3 ts 请求封装后端接口
一 首页-广告区域-小程序 首页-广告区域-小程序 GET/home/banner1.1 请求封装 首页-广告区域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函数定…...
[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)
[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1) 解题过程 打开题目环境 看题目意思应该是让我找备份文件 备份文件一般的后缀名为 .rar .zip .7z .tar.gz .bak .swp .txt .html .bak 直接扫描一下 在url中输入/index.php.bak 弱类型比较 为弱相等,即当…...
信创-人大金仓数据库创建
一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址:https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 实例结构 :由数据库文件和 KingbaseES 实例组成。数据…...
【QT】QTCreator测试程序
使用QTCreator实现窗体,其中拟合程度图左侧是测点列表,右侧是改测点的拟合程度图(不使用UI,使用代码编写实现) 实现思路 创建主窗口:继承 QMainWindow 类来创建主窗口。布局管理:使用 QSplitt…...
Python入门基础
python基础类型转换 str()与int()类型转换 name 张三 age 20 print(type(name),type(age))print(我叫name 今年, str(age)岁 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…...
Debug-037-table列表勾选回显方案
效果展示: 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能: 在图1中的列表中有三行数据,当点击“更换设备”按钮时,打开抽屉显示el-table组件如图2所示,可以直接回显勾选…...
Zotero·Awesome GPT配置
使用API配置(稳定,氪金) 配置1-1 (方式1)在DeepSeek 开放平台获得API Key,输入Awesome GPT的api key中;base api选项选择deepseek;Temperature设置1,Related Number设置…...
在 Simulink 里构建输水隧洞充水过程模型的基本步骤与思路
下面为你介绍在 Simulink 里构建输水隧洞充水过程模型的基本步骤与思路,不过由于没办法直接生成 Simulink 模型文件,这里会给出一个模拟该过程的 Matlab 脚本代码示例。 建模思路 输水隧洞充水过程一般能够用一阶常微分方程来描述,其方程如…...
网络基础梳理
为什么要有网络呢? 在一开始科学家们都是自己在计算机当中做实验但是难免需要共同进行科研。假设现在一个业务需要三个人共同完成,那么现在就有问题了: 由于第一个人完成工作前,其他两人无法开始,这导致工作流程是串行…...
Android开发检查是否是各大厂商手机的工具类
Android开发检查是否是各大厂商手机的工具类 有时需要知道该手机是vivo,oppo,xiaomi,huawei等手机时,需要用到 public class RomUtils {private static final String TAG "Rom";public static final String ROM_MIUI "MIUI";public static …...
系统与网络安全------网络应用基础(2)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 交换机 认识交换机 交换机,Switch 用户将多台计算机/交换机连接在一起,组建网络 交换机负责为其中任意两台计算机提供独享线路进行通信 非网管型交换机 即插即用交换机 即插即用&…...
vue项目配置服务器代理,解决请求跨域问题
在 Vue 项目中配置代理服务器,以下是常见的两种方式: 1、基于vue-cil(webpack)框架项目 vue.config.js module.exports {devServer: {proxy: {/api: {target: http://xxxxxx.com, // 服务器地址changeOrigin: true,pathRewrit…...
【硬核实战】ETCD+AI智能调度深度整合!从架构设计到调优避坑,手把手教你打造高可用调度系统!
一、核心架构设计:ETCD如何赋能AI调度? 🔥 架构图: [AI调度引擎] ← 实时数据 → [ETCD集群] ↓ 决策指令 [执行层(车辆/物流/交通设备)] 核心角色: ETCD:存储调度策略、节点状…...
《软件安装与使用教程》— NVIDIA CUDA在Windows的安装教程
《软件安装与使用教程》— NVIDIA CUDA在Windows的安装教程 Installed: - Nsight Monitor Not Installed: - Nsight for Visual Studio 2019 Reason: VS2019 was not found - Nsight for Visual Studio 2017 Reason: VS2017 was not found - Integrated Graphics Frame Debugge…...
Spring的bean生命周期
Spring框架中的bean生命周期指的是在容器中一个bean从创建到销毁的整个过程。以下是Spring中bean的生命周期的主要阶段: 实例化Bean:容器根据bean的定义创建bean的实例。 设值注入:容器通过setter方法或字段直接注入bean的属性。 调用Bean的…...
java执行jar包提示没有主清单属性
以前都没遇到过这种情况,什么时候打jar, war包都没有遇到过, 按照网上说的创建了META-INF/MANIFEST.MF 还是报错 于是检查下maven 打包发现:竟然有skip 为true 去掉 skip true ,进行打包,编译后正常...
基于 FPGA的HLS技术与应用
1、hls简介 HLS ( high level synthesis )即高层次综合,主要是利用高级编程语言实现算法。 2、循环优化 约束语法: #pragma HLS unroll #pragma HLS PIPELINE II1 绝大多数循环都以串行的方式执行,这种执行方…...
[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现复杂 Excel 数据处理:使用Java构建高效的数据导入解决方案
文章目录 一. 特殊 Excel 表格例子二. 使用示例1. bo 示例(部分字段)2. 自定义监听器3. 使用方法 三. 实现1. 工具类2. 默认基础导入(特殊 Excel 建立在这个基础上)2.1 Excel 导入监听2.2 默认监听2.3 Excel 返回对象2.3 默认excel返回对象实现 3. 特殊 Excel3.1 单元格位置类3…...
【数据库】sql错题详解
1. 执行子查询 SELECT 供应商号 FROM 订购单 WHERE 职工号 IN (E1, E3) GROUP BY 供应商号 HAVING COUNT(DISTINCT 职工号) 2筛选职工号为 E1 或 E3 的记录: 依据 WHERE 职工号 IN (E1, E3) 这个条件,从 订购单 表中把职工号为 E1 或者 E3 的记录筛选出…...
Three.js贴图技巧:优化性能与效果
引言 在当今数字化的时代,WebGL 技术为开发者们打开了一扇通往交互式 3D 图形世界的大门,而 Three.js 作为JavaScript库中的佼佼者,凭借其简单易用的 API 和丰富的功能,在创建3D场景和交互应用方面得到了广泛应用。在Three.js构建…...
Java Collection API增强功能系列之一 Arrays.asList()
在Java编程中,Arrays.asList() 是一个高频使用却又容易引发陷阱的工具方法。它能够快速将数组转换为列表,但其特殊行为常常让开发者踩坑。本文将深入剖析该方法的本质特性,并揭示其使用时的注意事项。一、方法定义与基础用法 1. 方法签名 p…...
websocket中spring注入失效
一个null指针引发的思考 websocket中spring注入失效 一个null指针引发的思考场景代码SpringBoot入口类配置类websocket类 问题排查问题1:问题2: 反思解决方案一:方案二:方案三:方案四: 场景 首页有个webso…...
Nat Commun:网络结构在塑造神经表征的强度中扮演着‘幕后推手’的角色
摘要 人类通过一系列离散事件构建他们对世界的心智模型。这一过程被称为图学习,它产生了一个编码事件间转移概率图的模型。近期的研究表明,一些网络比其他网络更容易学习,但这种效应的神经基础仍然未知。在这里,本研究使用功能磁共…...
Driver具体负责什么工作
在 Apache Spark 中,Driver(驱动程序) 是 Spark 应用的核心控制节点,负责协调整个应用的执行流程。它是用户编写的 Spark 应用程序(如 main() 方法)的入口点,直接决定了任务的调度、资源分配和结…...
LeetCode 热题 100----2.移动零
LeetCode 热题 100----2.移动零 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例 1:输入: nums [0,1,0,3,12] 输出: [1,3,12,…...
能源革命新突破:虚拟电厂赋能微电网智能调控,构建低碳生态新格局
在“双碳”目标的引领下,中央一号文件明确提出了“推进农村能源革命,深化绿色低碳技术应用”。作为能耗集中区域,产业园区如何实现清洁能源高效消纳与碳减排的目标成为了难题,中电国为推出的虚拟电厂与风光储充柴多能互补的微电网…...
Java集合框架深度剖析:从数据结构到实战应用
引言 Java集合框架是Java开发中的核心组件之一,其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景,集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发,深入剖析其主流实现类࿰…...
基于灵动微单片机SPIN系列的两轮车解决方案
电动车需配备与电机兼容性更高的双模控制器。灵动针对两轮车提供了相应的方案和解决算法。在两轮车的霍尔传感器出现故障时,系统应能继续有效地驱动电机。除了常规的过流、过压、过温保护措施外,灵动的方案还支持防盗功能,具备电刹车能力&…...
ngx_http_core_server_name
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_srv_conf_t *cscf conf;u_char ch;ngx_str_t *value;ngx_uint_t i;ngx_…...
【Docker系列一】Docker 简介
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
[C++面试] 你了解transform吗?
层级核心知识点入门基本语法、与for_each对比、单/双范围操作进阶动态扩展、原地转换、类型兼容性、异常安全高阶性能优化、C20 Ranges、transform_if模拟 一、入门 1、描述std::transform的基本功能,并写出两种版本的函数原型 std::transform函数是 C 标准库<…...
MSE分类时梯度消失的问题详解和交叉熵损失的梯度推导
下面是MSE不适合分类任务的解释,包含梯度推导。以及交叉熵的梯度推导。 前文请移步笔者的另一篇博客:大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比…...
docker 安装部署 canal
1 mysql 安装 1.1 拉取镜像 docker pull mysql:8.4.41.2 创建挂载目录 mkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/confmkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/datamkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/log1.3 编辑配置文…...
flowable适配达梦7 (2.1)
经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…...
优化 Docker 镜像 技巧
优化 Docker 镜像可以提高构建速度、减少镜像大小、提高安全性和效率。以下是一些优化 Docker 镜像的方法: 使用适当的基础镜像 选择合适的基础镜像可以减小镜像大小,并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选…...
Spring Boot框架中常用注解
以下是Spring Boot框架中常用注解的详细说明,包括名称、用途、用法、使用位置及扩展示例,按功能模块分类整理: 一、核心启动与配置注解 1. SpringBootApplication 用途:主启动类注解,整合了 Configuration、EnableAu…...
Linux笔记之Ubuntu22.04安装IBus中文输入法教程
Linux笔记之Ubuntu22.04安装IBus中文输入法教程 code review! 文章目录 Linux笔记之Ubuntu22.04安装IBus中文输入法教程安装 IBus 并配置中文输入法步骤 1: 安装 IBus 和拼音插件步骤 2: 设置 IBus 为默认输入法框架步骤 3: 重启会话步骤 4: 添加中文输入法步骤 5: …...
(UI自动化测试web端)第二篇:元素定位的方法_xpath属性定位
看代码里的【driver.find_element_by_xpath( )】()里的路径怎么写? xpath元素定位有多种写法,那我们现在说的就是在元素定位时,根据网页的实际情况来选择适合的xpath元素定位的写法。 文章主要介绍了xpath属性定位的方法和属性扩展使用的方法…...
Linux中执行 ifconfig 命令时提示 “未找到命令”
在 Linux 系统里,若执行 ifconfig 命令时提示 “未找到命令” 通常是由于系统没有安装 net-tools 包,或者该命令不在系统的 PATH 环境变量所包含的路径中 安装 net-tools 包 # Ubuntu/Debian sudo apt update sudo apt install net-tools# CentOS 7 及以…...
UE4学习笔记 FPS游戏制作15修正可以换枪中可以继续换枪和开火的Bug
现在存在的问题是换枪动作没完成时,可以继续换枪或者开枪 因为换枪这个动作是由玩家进行的,所以应该修改FppShooter脚本 我们添加两个参数 最后一次换枪的时间和换枪动画的长度 EquipmentLength 设置默认值0.6秒 添加一个新函数IsInEquip,返…...