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

Debezium日常分享系列之:Debezium3.1版本之增量快照

Debezium日常分享系列之:Debezium3.1版本之增量快照

  • 按需快照
  • 触发一次临时增量快照
  • 触发临时阻塞快照
  • 增量快照
  • 增量快照过程
  • 如何 Debezium 解决具有相同主键的记录之间的冲突
  • 快照窗口
  • 触发增量快照
  • 使用附加条件运行临时增量快照
  • 使用 Kafka 信号通道触发增量快照
  • 临时增量快照与附加条件
  • 停止增量快照
  • 附加资源
  • 使用 Kafka 信令通道停止增量快照

按需快照

默认情况下,连接器仅在首次启动后执行初始快照操作。在此初始快照之后,在正常情况下,连接器不会重复快照过程。连接器捕获的任何未来的更改事件数据都仅通过流处理过程进入。

然而,在某些情况下,连接器在初始快照期间获得的数据可能会变得过时、丢失或不完整。为了提供一种重新捕获表数据的机制,Debezium 包含了一个执行按需快照的选项。你可能希望在以下任何更改发生在你的 Debezium 环境中后执行按需快照:

  • 连接器配置被修改以捕获不同的表集。
  • Kafka 主题被删除且必须重建。
  • 由于配置错误或其他问题导致数据损坏。

你可以通过发起所谓的按需快照,重新运行之前已捕获快照的表的快照。按需快照需要使用 。你通过向 Debezium 信号表发送信号请求来启动按需快照。

当你对现有表启动按需快照时,连接器会将内容附加到该表已存在的主题上。如果先前存在的主题已被移除,当 启用时,Debezium 可以自动创建一个主题。

按需快照信号指定了要包含在快照中的表。快照可以捕获数据库的全部内容,或者只捕获数据库中的一组表。此外,快照还可以捕获数据库中表(们)的一部分内容。

你通过向信号表发送执行快照消息来指定要捕获的表。设置执行快照信号的类型为增量或阻塞,并提供要包含在快照中的表的名称,如下表所述:

表 2. 临时执行快照信号记录的示例

字段默认值描述
typeincremental指定要运行的快照类型。目前,您可以请求增量快照或阻塞快照。
data-collectionsN/A包含正则表达式数组,匹配要包含在快照中的表的全限定名称。<‍br‍>对于 SQL Server 连接器,使用以下格式指定表的全限定名称:database.schema.table
additional-conditionsN/A一个可选数组,指定连接器评估以确定要包含在快照中的记录子集的一组附加条件。<‍br‍>每个附加条件是一个对象,指定用于过滤临时快照捕获的数据的标准。您可以为每个附加条件设置以下参数:data-collection:应用过滤器的表的完全限定名称。您可以为每个表应用不同的过滤器。filter:指定数据库记录中必须存在的列值,以便快照包含该记录,例如,“color=‘blue’”。您分配给过滤器参数的值与在设置阻塞快照的 snapshot.select.statement.overrides 属性时,在 SELECT 语句的 WHERE 子句中可能指定的值类型相同。
surrogate-keyN/A一个可选字符串,指定连接器在快照过程中用作表主键的列名。

触发一次临时增量快照

您可以通过在信号表中添加一个带有 execute-snapshot 信号类型的条目,或通过向 Kafka 信号主题发送信号消息来启动一次临时增量快照。连接器处理该消息后,将开始快照操作。快照过程会读取每个表的第一个和最后一个主键值,并使用这些值作为每个表的起始点和结束点。根据表中的条目数量和配置的块大小,Debezium 将表分成多个块,并依次逐个进行快照。

触发临时阻塞快照

您可以通过在信号表或信号主题中添加带有 execute-snapshot 信号类型的消息来启动临时阻塞快照。连接器处理消息后,将开始快照操作。连接器会暂时停止流式传输,然后对指定的表进行快照,其过程与初始快照相同。快照完成后,连接器将恢复流式传输。

增量快照

SQL Server 排序规则

每个 SQL Server 服务器或数据库都配置为使用特定的排序规则,这决定了字符数据如何存储、排序、比较和显示。某些排序规则集(如SQL Server 排序规则 (SQL_*))的排序规则与 Unicode 排序算法不兼容。在某些情况下,不兼容的排序规则可能会导致连接器在执行即时快照时丢失数据。例如,如果 SQL Server 配置为以 Unicode 格式发送字符串(即连接属性 sendStringParametersAsUnicode 设置为 true),连接器在快照期间可能会跳过记录。为了防止在即时快照期间丢失数据,可以将连接字符串属性 driver.sendStringParametersAsUnicode 的值设置为 false。

为了提供管理快照的灵活性,Debezium 包含了一种补充的快照机制,称为增量快照。增量快照依赖于 Debezium 的向 Debezium 连接器发送信号的机制。增量快照基于 DDD-3 设计文档。

在增量快照中,与初始快照一次性捕获数据库的完整状态不同,Debezium 会分阶段、以一系列可配置的块来捕获每个表。你可以指定希望快照捕获的表以及每块的大小。块大小决定了每次从数据库获取数据时快照收集的行数。增量快照的默认块大小为 1024 行。

随着增量快照的进行,Debezium 使用水印来跟踪其进度,记录它捕获的每一行表数据。这种分阶段的数据捕获方法相比标准的初始快照过程具有以下优势:

  • 您可以在流式数据捕获的同时并行运行增量快照,而无需等到快照完成后再开始流式捕获。连接器在整个快照过程中继续从变更日志中捕获近乎实时的事件,两项操作互不干扰。
  • 如果增量快照的进度被中断,您可以从中断的地方恢复,而不会丢失任何数据。恢复后,快照将从停止的地方开始,而不是重新从头开始捕获整个表。
  • 您可以随时按需运行增量快照,并根据需要重复该过程以适应数据库更新。例如,您可能在修改连接器配置以添加一个表到其属性后重新运行快照。

增量快照过程

当你运行一个增量快照时,Debezium会根据主键对每个表进行排序,然后根据配置的块大小将表分成若干块。按块处理,它会捕获每块中的每一行记录。对于捕获的每一行,快照会发出一个READ事件。该事件表示在快照开始时该行的值。

随着快照的进行,其他进程可能会继续访问数据库,从而可能修改表记录。为了反映这些变化,INSERT、UPDATE或DELETE操作会像往常一样提交到事务日志。同样,持续的Debezium流处理过程会继续检测这些变更事件,并将相应的变更事件记录发送到Kafka。

如何 Debezium 解决具有相同主键的记录之间的冲突

在某些情况下,流处理过程中发出的 UPDATE 或 DELETE 事件会乱序接收。也就是说,流处理过程可能会在一个包含该行的 READ 事件的快照捕获之前,先发出一个修改表行的事件。当快照最终发出该行对应的 READ 事件时,其值已经被覆盖。为了确保乱序到达的增量快照事件能够按正确的逻辑顺序处理,Debezium 采用了缓冲方案来解决冲突。只有在解决了快照事件和流事件之间的冲突后,Debezium 才会将事件记录发送到 Kafka。

快照窗口

为了协助解决晚到的读取(READ)事件与修改同一表行的流式事件之间的冲突,Debezium 采用了所谓的快照窗口。快照窗口定义了增量快照捕获指定表分块数据的时间间隔。在某个分块的快照窗口开启之前,Debezium 按照其常规行为,直接将事务日志中的事件发送到目标 Kafka 主题。但从该特定分块的快照开启时刻起,直到它关闭为止,Debezium 会执行一个去重步骤,以解决具有相同主键的事件之间的冲突。

对于每个数据集合,Debezium 发出两种类型的事件,并将这些事件的记录存储在一个目标 Kafka 主题中。从表中直接捕获的快照记录作为 READ 操作发出。同时,随着用户继续更新数据集合中的记录,每次提交都会反映在事务日志中,Debezium 为每次更改发出 UPDATE 或 DELETE 操作。

当快照窗口打开,Debezium 开始处理快照分块时,它会将快照记录交付到内存缓冲区。在快照窗口期间,缓冲区中的 READ 事件的主键会被与传入的流式事件的主键进行比较。如果没有找到匹配项,流式事件记录将直接发送到 Kafka。如果 Debezium 检测到匹配项,它会丢弃缓冲的 READ 事件,并将流式记录写入目标主题,因为流式事件逻辑上覆盖了静态快照事件。在该分块的快照窗口关闭后,缓冲区中仅剩下没有相关事务日志事件的 READ 事件。Debezium 将这些剩余的 READ 事件发送到表的 Kafka 主题。

连接器对每个快照分块重复这一过程。

注意:
要使 Debezium 能够执行增量快照,您必须授予连接器写入信号表的权限。

只有可以配置为只读增量快照的连接器(MariaDB, MySQL, or PostgreSQL )才不需要写入权限。目前,您可以使用以下任一方法来启动增量快照:

  • 向源数据库上的信令表发送临时快照信号。
  • 向配置的 Kafka 信令主题发送消息。

SQL Server 的 Debezium 连接器在增量快照运行期间不支持模式更改。

触发增量快照

要启动增量快照,您可以向源数据库的信号表发送一个即时快照信号。您可以通过SQL INSERT查询提交快照信号。

当Debezium检测到信号表中的变化后,它会读取该信号,并执行请求的快照操作。

您提交的查询指定了要包含在快照中的表,并且可以选择性地指定快照操作的类型。目前,Debezium支持增量和阻塞两种类型的快照。

要指定要包含在快照中的表,请提供一个列出这些表的数据集合数组,或者用于匹配表的正则表达式数组,例如:

{"data-collections": ["public.MyFirstTable", "public.MySecondTable"]}

增量快照信号的数据集合数组没有默认值。如果数据集合数组为空,Debezium会将其解释为无需执行任何操作,因此不会进行快照。

注意:
如果您要包含在快照中的表名包含点(.)、空格或某些其他非字母数字字符,您必须用双引号将表名转义。

例如,要在db1数据库的public模式中包含名为My.Table的表,使用以下格式:“db1.public.“My.Table””。

先决条件

  • 已启用信号。
    • 源数据库上存在信号数据集合。
    • 信号数据集合在 signal.data.collection 属性中指定。

使用源信令通道触发增量快照

发送 SQL 查询,将临时增量快照请求添加到信令表中:

INSERT INTO <signalTable> (id, type, data) 
VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<fullyQualfiedTableName>","<fullyQualfiedTableName>"],"type":"<snapshotType>","additional-conditions":[{"data-collection": "<fullyQualfiedTableName>", "filter": "<additional-condition>"}]}');

例如:

INSERT INTO db1.myschema.debezium_signal (id, type, data) 
VALUES ('ad-hoc-1',   'execute-snapshot',  '{"data-collections": ["db1.schema1.table1", "db1.schema1.table2"], "type":"incremental", "additional-conditions":[{"data-collection": "db1.schema1.table1" ,"filter":"color=''blue''"}]}');

命令中的 idtypedata 参数的值对应于 信令表的字段。
下表描述了示例中的参数:

表 3. 发送增量快照信号到信令表的 SQL 命令中的字段说明

ItemValueDescription
1database.schema.debezium_signal指定源数据库上信令表的完全限定名称。
2ad-hoc-1id 参数指定一个任意字符串,该字符串被指定为信号请求的 id 标识符。使用此字符串将日志消息标识到信令表中的条目。Debezium 不使用此字符串。相反,在快照期间,Debezium 会生成自己的 id 字符串作为水印信号。
3execute-snapshot类型参数指定信号想要触发的操作。
4data-collections信号数据字段的必需组件,用于指定表名或正则表达式的数组,以匹配要包含在快照中的表名。该数组列出了使用 database.schema.table 格式的正则表达式,以匹配表的完全限定名称。此格式与您用于指定连接器信号表名称的格式相同。
5incremental信号数据字段的可选类型组件,用于指定要运行的快照操作的类型。有效值为增量和阻塞。如果您未指定值,则连接器默认执行增量快照。
6additional-conditions可选数组,用于指定一组附加条件,连接器将评估这些条件以确定要包含在快照中的记录子集。每个附加条件都是一个具有数据收集和过滤器属性的对象。您可以为每个数据收集指定不同的过滤器。* 数据收集属性是过滤器适用的数据收集的完全限定名称。

使用附加条件运行临时增量快照

如果您希望快照仅包含表中内容的子集,则可以通过将附加条件参数附加到快照信号来修改信号请求。

典型快照的 SQL 查询采用以下形式:

SELECT * FROM <tableName> ....

通过添加附加条件参数,您可以将 WHERE 条件附加到 SQL 查询,如下例所示:

SELECT * FROM <data-collection> WHERE <filter> ....

以下示例显示了一个 SQL 查询,用于将带有附加条件的临时增量快照请求发送到信令表:

INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<fullyQualfiedTableName>","<fullyQualfiedTableName>"],"type":"<snapshotType>","additional-conditions":[{"data-collection": "<fullyQualfiedTableName>", "filter": "<additional-condition>"}]}');

例如,假设您有一个包含以下列的产品表:

  • id(主键)
  • color
  • quantity

如果希望产品表的增量快照仅包含 color=blue 的数据项,则可以使用以下 SQL 语句来触发快照:

INSERT INTO db1.myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["db1.schema1.products"],"type":"incremental", "additional-conditions":[{"data-collection": "db1.schema1.products", "filter": "color=blue"}]}');

附加条件参数还允许您传递基于多个列的条件。例如,使用上例中的产品表,您可以提交一个查询来触发增量快照,该快照仅包含颜色=蓝色且数量>10 的商品的数据:

INSERT INTO db1.myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["db1.schema1.products"],"type":"incremental", "additional-conditions":[{"data-collection": "db1.schema1.products", "filter": "color=blue AND quantity>10"}]}');

以下示例显示了连接器捕获的增量快照事件的 JSON。

示例 1. 增量快照事件消息

{"before":null,"after": {"pk":"1","value":"New data"},"source": {..."snapshot":"incremental"     1},"op":"r", 2"ts_ms":"1620393591654","ts_us":"1620393591654547","ts_ns":"1620393591654547920","transaction":null
}

表 4. 增量快照事件消息中字段的描述

ItemField nameDescription
1snapshot指定要运行的快照操作的类型。目前,唯一有效的选项是阻止和增量。在提交给信令表的 SQL 查询中指定类型值是可选的。如果您未指定值,则连接器将运行增量快照。
2op指定事件类型。快照事件的值为 r,表示读取操作。

使用 Kafka 信号通道触发增量快照

您可以向配置的 Kafka 主题发送消息,请求连接器运行临时增量快照。

Kafka 消息的键必须与 topic.prefix 连接器配置选项的值匹配。

消息的值是一个带有类型和数据字段的 JSON 对象。

信号类型为 execute-snapshot,数据字段必须具有以下字段:

表 5. 执行快照数据字段

FieldDefaultValue
typeincremental要执行的快照类型。目前 Debezium 支持增量和阻塞类型。
data-collectionsN/A与要包含在快照中的表的完全限定名称匹配的逗号分隔正则表达式数组。使用与 signal.data.collection 配置选项所需的相同格式指定名称。
additional-conditionsN/A可选的附加条件数组,用于指定连接器评估的条件,以指定要包含在快照中的记录子集。每个附加条件都是一个对象,用于指定用于筛选临时快照捕获的数据的条件。您可以为每个附加条件设置以下参数:data-collection:: 过滤器适用的表的完全限定名称。您可以对每个表应用不同的过滤器。filter:: 指定数据库记录中必须存在的列值,快照才能将其包含,例如“color=‘blue’”。您分配给 filter 参数的值与您在为阻塞快照设置 snapper.select.statement.overrides 属性时在 SELECT 语句的 WHERE 子句中指定的值类型相同。

示例 2. 执行快照 Kafka 消息

Key = `test_connector`Value = `{"type":"execute-snapshot","data": {"data-collections": ["{collection-container}.table1", "{collection-container}.table2"], "type": "INCREMENTAL"}}`

临时增量快照与附加条件

Debezium 使用 additional-conditions 字段来选择表内容的子集。
通常,当 Debezium 运行快照时,它会执行类似以下的 SQL 查询:

SELECT * FROM <tableName> ...

当快照请求包含 additional-conditions 属性时,该属性的数据收集和过滤参数将被附加到 SQL 查询中,例如:

SELECT * FROM <data-collection> WHERE <filter> ...

例如,假设有一个 products 表,包含 id(主键)、colorbrand 列,如果希望快照只包含 color='blue' 的内容,在请求快照时,可以添加 additional-conditions 属性来过滤内容:

Key = `test_connector`Value = `{"type":"execute-snapshot","data": {"data-collections": ["db1.schema1.products"], "type": "INCREMENTAL", "additional-conditions": [{"data-collection": "db1.schema1.products" ,"filter":"color='blue'"}]}}`

您还可以使用 additional-conditions 属性传递基于多列的条件。例如,使用与上例相同的产品表,如果您希望快照仅包含 color=‘blue’ 和 brand=‘MyBrand’ 的产品表中的内容,则可以发送以下请求:

Key = `test_connector`Value = `{"type":"execute-snapshot","data": {"data-collections": ["db1.schema1.products"], "type": "INCREMENTAL", "additional-conditions": [{"data-collection": "db1.schema1.products" ,"filter":"color='blue' AND brand='MyBrand'"}]}}`

停止增量快照

在某些情况下,可能需要停止增量快照。例如,你可能会发现快照配置不正确,或者你希望确保资源可用于其他数据库操作。你可以通过向源数据库的信号表发送信号来停止正在进行的快照。

你可以通过发送SQL INSERT 查询将停止快照的信号提交到信号表。停止快照的信号指定了快照操作的类型为增量,并且可以选择性地指定你想从当前正在运行的快照中排除的表。当 Debezium 检测到信号表中的变化后,它会读取该信号,并在快照操作进行时停止增量快照。

附加资源

还可以通过向发送 JSON 消息来停止增量快照。

先决条件:

  • 源数据库上存在一个信令数据集合。
  • 信令数据集合在属性中指定。

使用源信令通道停止增量快照

向信令表发送 SQL 查询以停止临时增量快照:

INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<fullyQualfiedTableName>","<fullyQualfiedTableName>"],"type":"incremental"}');

例如,

INSERT INTO db1.myschema.debezium_signal (id, type, data) 
values ('ad-hoc-1',   'stop-snapshot',  '{"data-collections": ["db1.schema1.table1", "db1.schema1.table2"], "type":"incremental"}'); 

signal命令中的id、type、data参数的值与信令表的字段对应。
示例中的参数说明如下表:

表 6. 向信令表发送停止增量快照信号的 SQL 命令中字段说明

ItemValueDescription
1database.schema.debezium_signal指定源数据库上信令表的完全限定名称。
2ad-hoc-1id 参数指定一个任意字符串,该字符串被指定为信号请求的 id 标识符。使用此字符串将日志消息标识到信令表中的条目。Debezium 不使用此字符串。
3stop-snapshot指定类型参数指定信号想要触发的操作。
4data-collections信号数据字段的可选组件,用于指定要从快照中删除的表名或正则表达式的数组。该数组列出了与表的完全限定名称匹配的正则表达式,格式为 database.schema.table如果从数据字段中省略此组件,信号将停止正在进行的整个增量快照。
5incremental信号数据字段的必需组件,用于指定要停止的快照操作的类型。目前,唯一有效的选项是增量。如果您未指定类型值,则信号无法停止增量快照。

使用 Kafka 信令通道停止增量快照

您可以向配置的 Kafka 信令主题发送信号消息以停止临时增量快照。

Kafka 消息的键必须与 topic.prefix 连接器配置选项的值匹配。

消息的值是一个具有类型和数据字段的 JSON 对象。

信号类型为 stop-snapshot,数据字段必须具有以下字段:

表 7. 执行快照数据字段

FieldDefaultValue
typeincremental要执行的快照类型。目前 Debezium 仅支持增量类型。
data-collectionsN/A一个可选的逗号分隔正则表达式数组,用于匹配要从快照中删除的表的完全限定名称,该数组包含表名或正则表达式,用于匹配要从快照中删除的表名。使用 database.schema.table 格式指定表名。

以下示例显示了典型的停止快照 Kafka 消息:

Key = `test_connector`Value = `{"type":"stop-snapshot","data": {"data-collections": ["db1.schema1.table1", "db1.schema1.table2"], "type": "INCREMENTAL"}}`

相关文章:

Debezium日常分享系列之:Debezium3.1版本之增量快照

Debezium日常分享系列之&#xff1a;Debezium3.1版本之增量快照 按需快照触发一次临时增量快照触发临时阻塞快照增量快照增量快照过程如何 Debezium 解决具有相同主键的记录之间的冲突快照窗口触发增量快照使用附加条件运行临时增量快照使用 Kafka 信号通道触发增量快照临时增量…...

聊聊Spring AI的RedisVectorStore

序 本文主要研究一下Spring AI的RedisVectorStore 示例 pom.xml <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-vector-store-redis</artifactId> </dependency>配置 spring:ai:vectorstore:…...

Diffusion Policy Visuomotor Policy Learning via Action Diffusion官方项目解读(二)(4)

运行官方代码库中提供的Colab代码&#xff1a;vision-based environment&#xff08;二&#xff09;&#xff08;4&#xff09; 十六、函数unnormalize_data&#xff0c;继承自torch.utils.data.Dataset十六.1 def __init__()十六.2 def __len__ ()十六.3 def __getitem__()总体…...

52.个人健康管理系统小程序(基于springbootvue)

目录 1.系统的受众说明 2.开发环境与技术 2.1 MYSQL数据库 2.2 Java语言 2.3 微信小程序技术 2.4 SpringBoot框架 2.5 B/S架构 2.6 Tomcat 介绍 2.7 HTML简介 2.8 MyEclipse开发工具 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作…...

学习比较JVM篇(六):解读GC日志

一、前言 在之前的文章中&#xff0c;我们对JVM的结构、垃圾回收算法、垃圾回收器做了一些列的讲解&#xff0c;同时也使用了JVM自带的命令行工具进行了实际操作。今天我们继续讲解JVM。 我们学习JVM的目的是为了了解JVM&#xff0c;然后优化对应的参数。那么如何了解JVM运行…...

I²S协议概述与信号线说明

IIS协议概述 ​ IS&#xff08;Inter-IC Sound&#xff09;协议&#xff0c;又称 IIS&#xff08;Inter-IC Sound&#xff09;&#xff0c;是一种专门用于数字音频数据传输的串行总线标准&#xff0c;由飞利浦&#xff08;Philips&#xff09;公司提出。该协议通常用于微控制器…...

b4a安卓开发技术和建议,VB6开发Android APK

b4a功能建议实现方法想法创意Wait For可以在参数中直接返回结果吗&#xff1f;Wait For (cam.OpenCamera(front)) Complete (TaskIndex As Int) Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 函数别名&#xff0c;减少代码&#xff0c;通用函…...

计算机网络-子网划分试题七

计算机网络中IP地址为172.16.20.60、172.16.30.60、172.16.80.60&#xff0c;子网掩码为255.255.192.0的三台计算机的网络号&#xff0c;子网号及主机号&#xff0c;并确定三台计算机是否处于同一个子网&#xff0c;如果不是请指出哪些在同一个子网&#xff0c;哪些不是&#x…...

免费Deepseek-v3接口实现Browser-Use Web UI:浏览器自动化本地模拟抓取数据实录

源码 https://github.com/browser-use/web-ui 我们按照官方教程&#xff0c;修订几个环节&#xff0c;更快地部署 步骤 1&#xff1a;克隆存储库 git clone https://github.com/browser-use/web-ui.git cd web-ui Step 2: Set Up Python Environment 第 2 步&#xff1a;设置…...

[蓝桥杯] 求和

题目链接 P8772 [蓝桥杯 2022 省 A] 求和 - 洛谷 题目理解 这道题就是公式题&#xff0c;我们模拟出公式后&#xff0c;输出最终结果即可。 本题不难&#xff0c;相信很多同学第一次见到这道题都是直接暴力解题。 两个for循环&#xff0c;测试样例&#xff0c;直接拿下。 #in…...

大数据学习(100)-kafka详解

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

通过Ollama本地部署DeepSeek R1模型(Windows版)

嗨&#xff0c;大家好&#xff0c;我是心海 以下是一份详细的Windows系统下通过Ollama本地部署DeepSeek R1模型的教程&#xff0c;内容简洁易懂&#xff0c;适合新手用户参考 本地部署大模型&#xff0c;就有点像在你自己的电脑或者服务器上&#xff0c;安装并运行这样一个“私…...

【C++】vector的底层封装和实现

目录 目录前言基本框架迭代器容量第一个测试&#xff0c;野指针异常第二轮测试&#xff0c;浅拷贝的问题 元素访问修改操作push_backinsert迭代器失效问题 erase 默认成员函数构造函数双重构造引发调用歧义 拷贝构造赋值重载析构函数 源码end 目录 前言 废话不多说&#xff0…...

Open CASCADE学习|读取点集拟合样条曲线(续)

问题 上一篇文章已经实现了样条曲线拟合&#xff0c;但是仍存在问题&#xff0c;Tolerance过大拟合成直线了&#xff0c;Tolerance过大头尾波浪形。 正确改进方案 1️⃣ 核心参数优化 通过调整以下参数控制曲线平滑度&#xff1a; Standard_Integer DegMin 3; // 最低阶…...

ARM Cortex-M用于控制中断和异常处理的寄存器:BASEPRI、PRIMASK 和 FAULTMASK

在ARM Cortex-M处理器中&#xff0c;BASEPRI、PRIMASK 和 FAULTMASK 是用于控制中断和异常处理的系统级寄存器。它们的主要区别在于作用范围和灵活性&#xff0c;以下是详细说明&#xff1a; 1. PRIMASK • 功能&#xff1a; 禁用除以下情况的异常和所有中断&#xff08;Maska…...

Kafka 中的生产者分区策略

Kafka 中的 生产者分区策略 是决定消息如何分配到不同分区的机制。这个策略对 Kafka 的性能、负载均衡、消息顺序性等有重要影响。了解它对于高效地使用 Kafka 进行消息生产和消费至关重要。 让我们一起来看 Kafka 中 生产者的分区策略&#xff0c;它如何工作&#xff0c;以及…...

【Django】教程-11-ajax弹窗实现增删改查

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

结构化需求分析:专业方法论与实践

结构化需求分析是一种用于软件开发或其他项目中的系统分析方法&#xff0c;旨在全面、准确地理解和描述用户对系统的需求。以下是关于结构化需求分析的详细介绍&#xff1a; 一、概念 结构化需求分析是采用自顶向下、逐步分解的方式&#xff0c;将复杂的系统需求分解为若干个…...

R语言:气象水文领域的数据分析与绘图利器

R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…...

Kotlin与HttpClient编写视频爬虫

想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先&#xff0c;我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求&#xff0c;解析网页内容&#xff0c;提取视频链接&#xff0c;然后下载视频。可能需要处理不同的网站结构&#xff0c;甚至可能需要处理动态加载…...

图形化编程语言:低代码赛道的技术革命与范式突破

在 2024 年 Gartner 低代码平台魔力象限报告中&#xff0c;传统低代码厂商市场份额增速放缓至 12%&#xff0c;而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈&#xff0c;系统阐释图形化编程语言的核心优势&#xff0c;揭示其如何重构软件开发范…...

蓝桥杯每日刷题c++

目录 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 (luogu.com.cn) P8748 [蓝桥杯 2021 省 B] 时间显示 - 洛谷 (luogu.com.cn) P10900 [蓝桥杯 2024 省 C] 数字诗意 - 洛谷 (luogu.com.cn) P10424 [蓝桥杯 2024 省 B] 好数 - 洛谷 (luogu.com.cn) P8754 [蓝桥杯 2021 省 AB2…...

快速上手示例(以BEVFormer为例)

快速上手示例&#xff08;以BEVFormer为例&#xff09;‌ ‌安装依赖‌&#xff1a; bash git clone https://github.com/fundamentalvision/BEVFormer.git cd BEVFormer pip install -r requirements.txt‌下载预训练模型‌&#xff1a; wget https://github.com/fundament…...

GitHub 上开源一个小项目的完整指南

GitHub 上开源一个小项目的完整指南 &#x1f680; 第一步&#xff1a;准备你的项目 在开源之前&#xff0c;确保项目是可用且有一定结构的&#xff1a; ✅ 最低要求 项目文件清晰、结构合理&#xff08;比如&#xff1a;src/、README.md、LICENSE&#xff09;项目能在本地正…...

当实体类中的属性名和表中的字段名不一样 ,怎么办

在不同的持久化框架中&#xff0c;当实体类中的属性名和表中的字段名不一致时&#xff0c;有不同的解决办法&#xff0c;下面为你详细介绍&#xff1a; 1. MyBatis MyBatis 是一个流行的持久层框架&#xff0c;有两种主要方式来处理属性名和字段名不一致的情况。 方式一&…...

arthas之dump/classloader命令的使用

文章目录 1. dump2. classloader 1. dump 作用&#xff1a;将已加载类的字节码文件保存到特定目录&#xff1a;logs/arthas/classdump/ 参数 数名称参数说明class-pattern类名表达式匹配[c:]类所属 ClassLoader 的 hashcode[E]开启正则表达式匹配&#xff0c;默认为通配符匹…...

linux 使用 usermod 授权 普通用户 属组权限

之前写过这篇文章 linux 普通用户 使用 docker 只不过是使用 root 用户编辑 /etc/group用户所属组文件的方式 今天带来一种 usermod 命令行方式 以下3步&#xff0c;在root用户下操作 第一步&#xff0c;先创建一个普通用户测试使用 useradd miniuser第二步&#xff0c;授权到…...

大文件上传之断点续传实现方案与原理详解

一、实现原理 文件分块&#xff1a;将大文件切割为固定大小的块&#xff08;如5MB&#xff09; 进度记录&#xff1a;持久化存储已上传分块信息 续传能力&#xff1a;上传中断后根据记录继续上传未完成块 块校验机制&#xff1a;通过哈希值验证块完整性 合并策略&#xff1a;所…...

第一次3D打印,一个简单的小方块(Rhino)

一、建模 打开犀牛&#xff0c;我们选择立方体 我们点击上册的中心点 输入0&#xff0c;然后回车0 而后我们输长度&#xff1a;10&#xff0c;回车确认 同样的&#xff0c;宽度10 高度同样是10 回车确认后&#xff0c;我们得到一个正方形 二、导出模型 我们选择文件—>保存…...

java基础使用- 泛型

泛型 泛型作用泛型语法(1) 泛型类/接口(2) 泛型方法 类型参数命名习惯类型通配符&#xff08;Wildcards&#xff09;(1) 无界通配符 <?>表示“未知类型”(2) 上界通配符 <? extends T>表示“T 或 T 的子类”。(3) 下界通配符 <? super T>表示“T 或 T 的父…...