某政务行业基于 SeaTunnel 探索数据集成平台的架构实践
分享嘉宾:某政务公司大数据技术经理 孟小鹏
编辑整理:白鲸开源 曾辉
导读:本篇文章将从数据集成的基础概念入手,解析数据割裂给企业带来的挑战,阐述数据集成的重要性,并对常见的集成场景与工具进行阐述,最后介绍了Apache SeaTunnel在应对技术挑战的架构演进。
包括以下几方面内容:
- 什么是数据集成
- 为什么要做数据集成?
- 常见的数据集成工具
- 离线场景的数据集成工具分析
- 离线 + 实时场景的数据集成需求与挑战
- Apache SeaTunnel 简介
什么是数据集成?
在当今的数字化时代,数据被称为“新石油”,其价值在于通过分析和应用为企业提供决策支持。然而,许多企业面临的一个共同挑战是数据割裂——数据分散在不同的业务线或系统中,导致信息孤岛、效率低下等问题的产生。
拿数据集成到底是什么呢?数据集成作为解决上述问题的重要手段,主要是通过将来自不同来源的数据标准化、清洗并统一整合成视图或存储形式,为企业的数据治理、分析和业务使用提供坚实的基础。
为什么要做数据集成?
在企业发展的早期,通常存在多个独立发展的业务线,比如 APP 1、APP 2 和 APP 3。
这些业务线在早期阶段缺乏统一的规划,导致各业务线分别维护自己的数据存储,形成了割裂的场景。独立的数据系统之间缺乏连接与协同,形成了数据“烟囱效应”和“信息孤岛”。这些问题的存在直接影响了企业的运营效率和决策能力,并引发了一系列具体挑战。
数据割裂带来的问题
决策数据的缺失
信息孤岛使得高层管理人员无法获取完整的数据视图,决策依据不完整,可能导致错误的决策。
资源浪费
多个业务线独立存储数据,增加了存储成本。同时,分散的数据管理也增加了复杂性和运维难度。
用户体验的割裂
在割裂的系统下,难以为用户提供一致性的服务。例如,不同APP中的数据无法同步,导致用户体验不佳。
数据安全隐患
数据重复存储(如多APP中都存储用户表)增加了数据丢失和泄露的风险。
数据流通效率低下
割裂的数据使企业难以实现高效的数据流通和跨业务的协同,最终导致整体业务效率的下降。
数据集成的必要性
为了应对以上挑战,需要通过数据集成工具将原本割裂的数据统一汇聚到一个中心化的存储位置,如数据中心或数据湖。
这种统一的存储方式可以带来以下优势:
支持多维度分析
例如,在电子商务场景下,构建用户忠诚度模型可能需要综合以下数据来源:
- 商品详情
- 用户满意度评分
- 用户活跃度数据
如果数据割裂,难以进行统一统计。而通过数据集成工具,能够将所有数据汇聚到一个仓库中,以实现多维度分析。
提升业务效率
通过统一的数据存储,可以减少数据重复,优化资源使用,并为业务提供高效的数据支持。
增强数据安全
数据的集中存储和统一管理能够降低数据泄露的风险,并简化安全管控。
优化用户体验
数据的统一可以实现跨业务的协同,为用户提供一致性更高的服务。
数据集成工具的场景
数据集成工具主要用于两种场景:
实时场景
需要在数据产生后快速同步到目标系统,适用于实时性要求高的业务场景。
离线场景
数据在特定时间点批量同步,适用于需要处理大规模历史数据的场景。
通过合理选择和配置数据集成工具,可以有效解决企业的数据割裂问题,为业务发展和决策支持提供坚实的基础。
常见的数据集成工具
在数据集成场景中,根据需求的不同,市面上或开源社区中存在多种数据集成工具。数据同步场景可以分为两类:基于查询的批处理场景和基于实时捕获的场景。
以下将对这两类场景及其对应工具的特点进行分析。
数据同步的两大场景
基于查询的批处理场景
特点:
- 通过定期调度的方式,将关系型数据库中的数据同步到目标系统。
- 以批处理方式进行,实时性要求较低。
- 适用于需要处理大规模历史数据或周期性分析的场景。
典型应用:
- 数据仓库的构建
- 历史数据分析
- 报表生成
基于实时捕获的流式处理场景
特点:
- 实时捕获和解析数据库中的变更数据(CDC, Change Data Capture)。
- 能够及时同步变更数据到目标系统,满足高实时性需求。
- 适用于需要实时响应和高时效场景的应用。
典型应用:
- 实时推荐系统
- 交易监控
- 实时日志分析
工具举例:
- Debezium:通过捕获关系型数据库(如MySQL的binlog或MongoDB的oplog)的变更日志,实现实时数据同步。
- Apache Kafka:配合Kafka Connect,可实现分布式数据流的实时采集与传输。
- Apache SeaTunnel:支持多种实时数据源和Sink,适合复杂的流式数据集成任务。
数据集成工具在数据仓库中的作用
无论是批处理还是实时场景,数据集成工具的最终目标都是将源数据统一采集到数据仓库或数据湖中,为后续的分析和应用提供支持。例如:
批处理场景:
将关系型数据库的数据定期采集到数据仓库,为离线数据分析和报表生成提供数据基础。
实时场景:
捕获数据库中的变更事件,通过实时同步到数据仓库,支持实时监控、推荐系统等应用。
Apache SeaTunnel 就是一个兼顾批处理和实时流式处理的集成工具,通过灵活的架构和丰富的连接器,能够满足多种数据集成需求。数据集成工具是现代数据生态中不可或缺的一环。根据场景需求选择合适的工具,可以大幅提升数据流通效率,为企业数据仓库建设和实时数据处理提供坚实保障。
离线场景的数据集成工具分析
在离线场景中,最常见的同步工具之一是 DataX。它作为一个新型架构的离线数据同步工具,被广泛应用于批量数据的迁移和同步。
然而,在使用过程中也暴露出了一些问题,尤其是在面对当前数据生态和未来发展的需求时,其局限性愈发明显。
DataX 的主要问题
生态不足
DataX 是一个专注于离线数据同步的框架,因此在实时数据同步方面存在明显的短板。这种生态不足表现为以下几点:
- 实时场景的缺失:在需要处理实时变更数据(如CDC)的场景中,DataX 无法满足需求。
- 信创化数据库支持的不足:随着国家对于信创国产化的政策要求,到 2026 年之前,政府部门和政务系统需要逐步替换为国产化数据库。然而,DataX 对国产化数据库的支持还不够完善,生态覆盖面较窄。
兼容性不足
DataX 在处理多种数据源类型时,采用了统一的架构设计,核心是 Reader 和 Writer 模块(如图所示),通过统一的接口和方法实现对不同数据库类型的支持。
这种设计虽然简化了架构复杂度,但也带来了兼容性问题:
- 字段类型处理粗糙:DataX 在字段映射和类型转换时,所有数据库类型的处理逻辑都集中在同一个函数内。这种实现方式对于一些特殊数据类型(如大字段、特殊格式的字段)的处理显得力不从心。
- 数据兼容性问题:对于某些复杂或非常规的数据源类型,DataX 需要额外定制化开发来满足需求,增加了使用和维护成本。
性能不足
DataX 的开源版本采用单节点架构,在处理超大规模数据时,性能瓶颈尤为明显:
- 单节点限制:单节点架构难以扩展,无法充分利用分布式系统的性能优势。
- 性能压力:在处理超大数据规模的场景下(如TB级别的数据迁移),性能往往难以满足企业需求,成为生产环境中的瓶颈。
需求驱动的工具演进
针对离线场景中暴露的问题,现代数据集成工具需要具备以下能力:
支持多种数据源的广泛兼容性:包括国产化数据库的适配和特殊字段类型的处理能力。
高性能架构:采用分布式架构以满足超大规模数据处理的需求。
实时与离线一体化:既能满足离线批量同步的需求,也能兼顾实时数据的同步能力。
DataX 的局限性为企业在选择数据集成工具时提供了警示:工具的适配性与扩展性决定了其在多样化需求下的生存能力。选择一个更灵活、更高效的工具(如 Apache SeaTunnel),能够帮助企业在离线数据同步中获得更高的性能和更广的生态支持。
离线 + 实时的需求与挑战
在现代数据平台中,数据集成通常涉及两大场景:离线场景与实时场景。企业在最初构建数据集成框架时,往往以离线场景为主,但随着业务需求的增加和数据分析实时性的要求提升,实时场景逐渐成为数据集成的重要组成部分。
当离线框架已成型而实时需求增加时,企业需要在原有架构基础上引入一条实时数据链路,这种扩展带来了新的挑战。
Lambda 架构下的痛点
Lambda 架构在数据集成领域的典型表现为同时运行离线和实时两条数据链路。这种架构虽然满足了多样化需求,但也引发了以下问题:
多条链路运维复杂
离线链路和实时链路需要分别设计和维护,增加了数据治理的复杂性。例如,离线链路可能基于 DataX,而实时链路则可能使用 Flink CDC,涉及不同的工具和框架。
重复开发工作
两套链路往往需要分别开发,重复性工作增加了开发成本。离线链路开发基于工具如 DataX,而实时链路需要构建 Flink 集群等,技术栈不同,导致开发和运维成本提高。
多技术栈的割裂
离线链路和实时链路使用不同技术栈,造成开发团队需要掌握多种工具,技术培训和维护难度增加。数据平台需要同时支持离线和实时的数据治理能力,进一步增加了平台的复杂性。
理想的数据集成工具的特点
为了解决上述问题,企业需要一个能够同时支持离线和实时场景的工具。
我认为以下是理想数据集成工具的关键特性:
丰富的生态支持
- 能够兼容多种数据源,包括主流数据库(如 MySQL、Oracle)以及国产化数据库。
- 适配多种Sink端(如数据仓库、数据湖、消息队列等),满足复杂的集成需求。
分布式架构
- 支持高并发和海量数据的处理,提供优越的扩展性。
- 在集群环境中高效运行,充分利用硬件资源。
批流一体
- 同时支持离线和实时数据同步需求,兼容批处理和流式处理架构。
- 减少多条链路运维的复杂性,实现一次开发、多场景复用。
性能优越
- 提供高吞吐和低延迟的数据处理能力,满足实时性要求。
- 在资源使用上做到高效,优化存储和计算的成本。
社区活跃度高
- 开源项目的活跃度能够保证工具的持续改进和问题响应速度。
- 丰富的文档和社区支持降低了上手难度。
批流一体架构的价值
通过批流一体的数据集成工具,可以有效解决 Lambda 架构带来的痛点:
简化运维:仅需维护一套架构,减少多链路治理的负担。
提升开发效率:通过一次开发,兼容离线和实时场景,避免重复劳动。
技术栈统一:减少技术培训和开发成本,增强团队协作效率。
像 Apache SeaTunnel 这样的批流一体架构工具,能够在离线与实时场景中都发挥优势,不仅具备丰富的生态支持,还具有优越的性能和分布式架构能力,是解决当前数据集成复杂性的优秀选择。
Apache SeaTunnel 简介
定义与背景
那给大家讲了这么久,SeaTunnel是什么呢?Apache SeaTunnel 是一款下一代高性能分布式超大规模数据同步工具,专为解决现代企业的批处理和实时流处理需求而设计。其名字来源于科幻小说《三体》中的“水滴”,早期被称为 WaterDrop,后在 2021 年更名为 Apache SeaTunnel。
上图展示了 SeaTunnel 的 LOGO,设计灵感源于水滴的简洁与强大,寓意其在数据处理领域的高效与灵活。
核心特性
Apache SeaTunnel 的核心特性围绕其在批处理与实时流处理中的统一能力展开:
批流一体架构
SeaTunnel 采用批流一体的架构,能够同时支持批数据处理和实时流数据处理:
- 无缝切换:在引擎层实现批处理和流处理的无缝切换,满足不同场景需求。
- 高灵活性:通过统一架构简化了开发与运维工作,提升了数据处理效率。
灵活的数据处理流程
从架构图中可以看出,SeaTunnel 的数据处理过程主要分为以下三部分:
- Source 层:定义数据源,支持多种主流数据源类型。
- Transform 层:执行轻量级的数据转换,如清洗、聚合等。
- Sink 层:将处理后的数据输出到目标位置,例如数据仓库、消息队列等。
这一架构允许开发者通过定义任务的输入、转换和输出,快速构建和部署数据管道。
架构演进
SeaTunnel 的核心架构在设计上强调抽象性和模块化,其核心组件如下:
-
任务初始化
每当用户定义了一个数据处理任务时,SeaTunnel 的引擎会将任务逻辑抽象为一个标准化的任务描述,完成初始化工作。 -
翻译层
翻译层的作用是将用户定义的 Source、Transform 和 Sink 转换为引擎可以识别的API调用。这一转换过程包括:- 将接口或代码片段抽象化。
- 转化为引擎能够识别的数据处理任务。
- 交由引擎执行完成整个数据流的处理。
-
模块化设计
SeaTunnel 的架构采用模块化设计,将数据输入、转换和输出分开,便于扩展和维护。
应用场景与案例
Apache SeaTunnel 的强大特性使其在以下场景中表现优异:
实时流处理
支持对交易监控、实时推荐等需要快速响应的场景进行高效处理。
批量数据处理
适合构建数据仓库、生成历史数据报表等大规模离线分析任务。
跨平台数据集成
无论是传统关系型数据库还是现代数据湖,SeaTunnel 都能通过其丰富的连接器生态,实现多种数据源与目标的无缝对接。
Apache SeaTunnel 特性
丰富的生态支持
Apache SeaTunnel 提供了丰富的生态支持,能够与170+种数据源和目标系统无缝对接,覆盖了常见的数据库、消息队列、大数据存储等组件。
目前支持的生态包括(展示部分):
- 关系型数据库:PostgreSQL、Oracle、MySQL
- 消息队列:Kafka、RabbitMQ、Pulsar
- 数据湖:Paimon、Hudi、Iceberg
- 大数据存储:HDFS、Hive、Kudu
- NoSQL 数据库:MongoDB、HBase、Redis
- 分析型数据库:ClickHouse、Doris
- 搜索引擎:Elasticsearch、Eazysearch
- 时序数据库:InfluxDB、TDengine
- 国产数据库:DM、openGauss
丰富的生态支持减少了开发者开发自定义插件的工作量,大幅降低了开发和维护成本。
多引擎支持
SeaTunnel 提供对以下三种引擎的支持:
Flink:主流流式计算引擎,适合需要实时数据处理的场景。
Spark:广泛应用于大数据离线处理的主流引擎。
Zeta 引擎:SeaTunnel 自主研发的轻量级引擎,专为不具备大数据平台或 Kubernetes 支持的企业设计。
Zeta 引擎的优势
- 适用场景:适合数据量较小、希望使用分布式能力但缺乏大数据平台支持的企业。
- 高性能:即使在资源较少的环境中,仍能提供优异的性能表现。
- 对比性能:在与 DataX 和 AWS DMS 的性能对比中,Zeta 引擎表现出资源占用低、处理速度快的特点。
数据处理能力
SeaTunnel 提供了强大的 Transform 模块,专注于轻量级的数据清洗与转换,包括以下功能:
轻量级处理:适合数据同步过程中需要的简单操作,例如:
- 增加虚拟字段
- 对行数据进行截取操作
- 引入加解密函数
复杂处理建议:对于复杂或重量级的处理,建议使用前置或后置的数据库(如通过SQL进行预处理),以更高效地利用现有数据库的计算能力。
性能对比
以下是 Apache SeaTunnel 在不同引擎下的性能表现(以 Zeta 引擎为例):
- 与 DataX 的对比:在资源较少的环境中,Zeta 引擎的性能明显优于 DataX,同步时间更短。
- 与 AWS DMS 的对比:Zeta 引擎在同步性能和资源效率方面表现优异,能够在更短的时间内完成数据同步。
Zeta 引擎(橙色部分)在资源和时间消耗上的表现均优于对比产品。
Apache SeaTunnel 架构演进
Apache SeaTunnel 的架构经历了从 V1 到 V2 的重要演进。这一演进的核心在于 解耦,显著提升了框架的灵活性、扩展性和维护性。
以下将对其架构演进过程及关键变化进行详细介绍。
V1 架构:多引擎高度耦合
在 V1 架构中,SeaTunnel 支持多个引擎(如 Flink 和 Spark),并针对每个引擎设计了独立的 API。
这种设计带来了以下问题:
多次实现成本高
- 每个新插件需要针对所有引擎分别实现一次。例如,将关系型数据库的数据同步到消息队列,需要分别开发适配 Flink 和 Spark 的逻辑。
引擎与插件的强耦合
- 插件(如 Source、Sink、Transform)与具体引擎深度绑定,导致版本升级和参数优化变得困难。
难以统一优化
- 各引擎独立运行,插件和任务的参数难以统一管理,增加了运维成本。
版本依赖复杂
- Source 到 Sink 端的逻辑高度依赖引擎的具体版本,导致版本升级风险高、成本大。
V2 架构:解耦与通用化
在 V2 架构中,SeaTunnel 通过解耦实现了高度模块化和灵活性。以下是架构的关键改进:
任务初始化的抽象化
SeaTunnel 将任务的输入(Source)、转换(Transform)、输出(Sink)进行高度抽象,形成统一的任务初始化流程:
- Source:定义数据来源。
- Transform:执行轻量级的数据转换。
- Sink:指定数据的目标存储位置。
这一层的抽象化解除了插件与引擎的绑定,使任务可以适配任何引擎(如 Flink、Spark、Zeta)。
引入翻译层(Translation)
翻译层负责将用户定义的任务通过通用 API 转换为具体引擎可执行的代码:
- 通用性:开发者只需实现一次 Source、Transform 和 Sink 的逻辑,翻译层会自动适配引擎。
- 降低开发成本:减少了插件开发中对多引擎的重复适配需求。
- 简化版本升级:由于插件与引擎解耦,版本升级仅需在翻译层中调整相关逻辑,无需修改核心插件。
参数与版本的统一
通过抽象化和翻译层的引入,SeaTunnel 实现了:
- 参数的统一管理:简化了多引擎场景下的任务配置。
- 版本升级的灵活性:任务的逻辑独立于引擎版本,升级引擎时无需担心任务兼容性问题。
解决业务痛点
实时与离线场景的统一
SeaTunnel 的 V2 架构解决了 Lambda 架构中的多条链路问题:
离线场景:支持任务调度和工作流的管理,满足复杂的批处理需求。
实时场景:支持实时数据处理与项目管理,适配动态业务需求。
降低开发成本与提升效率
- 商业化解决方案:例如,白鲸开源已基于Apache SeaTunnel 开发的并推出了商业版软件 WhaleTunnel,提供企业级功能增强、服务、运维、Debug、定期漏洞扫描和修复,无论是产品功能、稳定性、兼容性、速度还是安全性,都比开源版 Apache SeaTunnel 有巨大的进步!
- 工程化与规模化:通过工具的优化,企业可以快速构建高效的数据集成平台,减少自研成本。
总结
从 V1 到 V2 的架构演进,Apache SeaTunnel 实现了从多引擎耦合到解耦的飞跃。通过引入任务抽象化、翻译层和参数统一管理,SeaTunnel 不仅提高了开发效率,还显著降低了版本升级和运维的复杂度。在离线与实时场景的统一支持下,SeaTunnel 成为企业数据集成的强大工具,也为开发者提供了更多可能性。
祝愿 Apache SeaTunnel 社区和相关商业产品在未来的发展中越来越好!
本文由 白鲸开源科技 提供发布支持!
相关文章:
某政务行业基于 SeaTunnel 探索数据集成平台的架构实践
分享嘉宾:某政务公司大数据技术经理 孟小鹏 编辑整理:白鲸开源 曾辉 导读:本篇文章将从数据集成的基础概念入手,解析数据割裂给企业带来的挑战,阐述数据集成的重要性,并对常见的集成场景与工具进行阐述&…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)
为进一步测试通过请求头传递token进行身份验证,在main.htm中增加layui的数据表格组件,并调用后台服务分页显示数据,后台分页查询数据接口如下所示(测试时,直接将数据写死到代码中,没有查询数据库࿰…...
Android 高德地图API(新版)
新版高德地图 前言正文一、创建应用① 获取PackageName② 获取调试版安全码SHA1③ 获取发布版安全码SHA1 二、配置项目① 导入SDK② 配置AndroidManifest.xml 三、获取当前定位信息① ViewBinding使用和导包② 隐私合规设置③ 权限请求④ 初始化定位⑤ 获取定位信息 四、显示地…...
51c~缺陷检测~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12386431 一、缺陷检测~使用深度学习1 这里研究工业ai, 在制造业中任何公司的主要目标都是为客户生产无缺陷产品。如果在产品开发过程中出现任何内部孔、凹坑、磨损或划痕(由于多种原因,从生产设备…...
强化学习与ai黑科技实例
一.强化学习简介和其应用 (1)强化学习,深度学习,有监督,无监督区别与联系。 1)强化学习讨论的核心就是智能机(agent)怎么在复杂,不确定的环境中最大化它能获得的奖励。 2)人工智能包括机器学习,机器学习包括有监督学习,无监督学习(例如聚类…...
《TikTok归来:机遇与挑战并存》
TikTok 回归:波折中的 “重生” 在全球社交媒体的版图中,TikTok 的存在无疑是一颗璀璨的明星。它以独特的短视频形式、强大的算法推荐以及丰富多样的内容,迅速风靡全球,吸引了数以亿计的用户。然而,其发展并非一帆风顺…...
Rust语言的正则表达式
Rust语言的正则表达式 正则表达式(Regular Expressions,简称Regex)是一种强大的文本处理工具,广泛应用于字符串的搜索、匹配、替换和解析。在Rust语言中,正则表达式的支持既高效又功能强大,非常适合开发者…...
三维扫描赋能文化:蔡司3D扫描仪让木质文化遗产焕发新生-沪敖3D
挪威文化历史博物馆在其修复工作中融入现代3D扫描技术,让数百年的历史焕发新生。 文化历史博物馆的工作 文化历史博物馆是奥斯陆大学的一个院系。凭借其在文化历史管理、研究和传播方面的丰富专业知识,该博物馆被誉为挪威博物馆研究领域的领先机构。馆…...
c# PDF文件合并工具
界面 主要用于发票PDF文件的合并。经常出差要报销的很有用。 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System…...
【16届蓝桥杯寒假刷题营】第1期DAY5
5.依依的询问最小值 - 蓝桥云课 问题描述 依依有个长度为 n 的序列 a,下标从 1 开始。 她有 m 次查询操作,每次她会查询下标区间在 [li,ri] 的 a 中元素和。她想知道你可以重新排序序列 a,使得这 m 次查询的总和最小。 求你求出 m 次…...
.NET周刊【1月第1期 2025-01-05】
国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处…...
(7)(7.2) 围栏
文章目录 前言 1 通用设置 2 围栏类型 3 破坏栅栏行动 4 使用 RC 通道辅助开关启用栅栏 5 自动高度规避 6 在任务规划器中启用围栏 7 用于遥控飞行训练 8 MAVLink 支持 前言 ArduPilot 支持基于本机的圆柱形(“TinCan”)和多边形和/或圆柱形、…...
1166 Summit (25)
A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone. Now given a set of tenta…...
linux_socket
udp 通信 server #include <iostream> #include <arpa/inet.h> #include <unistd.h> #include <cstring>using namespace std;#define UPORT 12511int main(){int sock socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP套接字if (sock -1) {cout&…...
Linux探秘坊-------3.开发工具详解(2)
1.动静态库和动静态链接(操作) 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件 ⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a” 动态库与之相反,在编译链接时并 没有把库⽂件的代码加⼊到可执⾏⽂件中 ,⽽…...
Mysql InnoDB B+Tree是什么?
“mysql中常用的数据库搜索引擎InnoDB,其索引通过BTree的方式进行构建。” 实在想不起来BTree是怎么一回事了。以点带线,将涉及到的数据结构一起复习一下。 文章目录 数据结构定义红黑树定义使命 BTree定义使命 BTree定义 InnoDB BTree 旋转与调整二叉排序树插入删…...
C语言进阶习题【1】指针和数组(1)——一维数组
1. 数组名的意义: sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。(一维数…...
2024:成长、创作与平衡的年度全景回顾
文章目录 1.前言2.突破自我:2024年个人成长与关键突破3.创作历程:从构想到落笔,2024年的文字旅程4.生活与学业的双重奏:如何平衡博客事业与个人生活5.每一步都是前行:2024年度的挑战与收获6.总结 1.前言 回首2024年&a…...
【Linux】网络基础探索:开启你的网络之旅
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 计算机网络背景 🦋 1-1 网络发展 二:🔥 初识协议 🦋 2-1 协议分层协议分层 vs. 软件分层 🦋 2-…...
function isBulkReadStatement, file SQLiteDatabaseTracking.cpp
一问题:Xcode16.0运行在iPhone16/ios18.0 以上发生闪退, 闪退在 YYCache–>YYKVStorage 文件内。 以上删除保以下错误: function isBulkReadStatement, file SQLiteDatabaseTracking.cpp 解决方案: 找到YYKVStorage文件中_d…...
React 中hooks之useTransition使用总结
目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook,用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应,通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...
leetcode 3097. 或值至少为 K 的最短子数组 II 中等
给你一个 非负 整数数组 nums 和一个整数 k 。 如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k ,那么我们称这个数组是 特别的 。 请你返回 nums 中 最短特别非空 子数组 的长度,如果特别子数组不存在,那么返回 -1 。 示例 1&…...
C# OpenCV机器视觉:特征匹配 “灵魂伴侣”
在一个阳光仿佛被施了魔法,欢快得直蹦跶的早晨,阿强像个即将踏上神秘寻宝之旅的探险家,一屁股墩在实验室那张堆满各种奇奇怪怪小玩意儿的桌前。桌上,零件、线路、半成品设备乱成一团,唯有他那宝贝电脑屏幕散发着清冷又…...
DDD - 整洁架构_解决技术设计困局
文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...
金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成
目录 一、投资模块(投资接口投资业务) 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块(投资接口投资业务…...
Ceph与RAID在存储中的协同工作过程
本文将结合架构图,详细讲解Ceph与RAID如何在存储环境中相互配合,共同提供高效且可靠的存储服务。 架构概述 从上图中可以看到,Ceph的架构主要分为四个层次: 客户端和服务接口层:这一层包括客户端访问存储应用的接口…...
《重生到现代之从零开始的C++生活》—— 类和对象2
类的默认成员函数 默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数,一个类会默认生成6个成员函数 构造函数 构造函数时特殊的成员函数,构造函数的初始化对象 函数名与类名相同 没有返回值 对象实例化的时候胡自动调用构造…...
MFC 使用 32位带Alpha通道的位图
最近需要做一个MFC界面上的图片,众所周知,MFC 好像只支持 bmp 格式的! 先看我的原始24位图片,RGB 三个颜色各占8位 (256色), 所以是24位。 如果放到MFC界面上,是这个很丑的效果 它是一个正方形图片,周围的白色可以看见。 解下来,进入今天的主题: 32位带 Alpha 通…...
QT:子控件VLC播放视频时,父控件无法截取鼠标事件
具体来说: 反复验证,结论正确。只要是播放区(即传递给VLC的窗口区域),就无法点击。 比如WidgetA,新建一个WidgetB,设置位置时留有一点边框。这个时候WidgetA的边框区是能收到鼠标事件的。 这…...
力扣 739. 每日温度
🔗 https://leetcode.cn/problems/daily-temperatures 题目 给定一个数组,表示每天的天气返回一个数组,index i 表示几天后比当前的温度要高,没有则为 0 思路 维护一个单调递减栈,若当前的温度比栈顶大,…...
蓝桥杯 阶乘的和(C++完整代码+详细分析)
题目描述 原题链接 阶乘的和 问题描述 给定 n 个数 Ai,问能满足 m! 为 ∑(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 123⋯m。 输入格式 输入的第一行包含一个整数 n。 第二行包含 n 个整数,分别表示 Ai,相…...
OpenAI进军实体机器人:GPT赋能的智能未来
近年来,人工智能技术飞速发展,深刻地改变着我们的生活。而OpenAI作为人工智能领域的领军者,其最新动作更是引人注目:进军实体机器人领域!这不仅标志着人工智能技术应用场景的重大拓展,也预示着未来智能机器…...
【Python运维】用Python管理Docker容器:从`docker-py`到自动化部署的全面指南
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发和运维过程中,Docker容器化技术因其高效、轻量和可移植性而被广泛应用。Python作为一种灵活且功能强大的编程语言,通过doc…...
【机器学习实战入门项目】MNIST数字分类机器学习项目
Python 深度学习项目:手写数字识别 为了使机器更加智能,开发者们正在深入研究机器学习和深度学习技术。人类通过不断练习和重复来学习执行某项任务,从而记住如何完成这些任务。然后,大脑中的神经元会自动触发,他们能够…...
【统计信号处理基础——估计与检测理论】Vol1.Ch1 引言
文章目录 1. 信号处理中的估计2. 估计的数学问题3. 估计量性能评估习题1.11.21.31.41.5 1. 信号处理中的估计 从离散时间波形或一组数据集中提取参数的问题。我们有 N N N点数据集 { x [ 0 ] , x [ 1 ] , ⋯ , x [ N − 1 ] } \{x[0],x[1],\cdots,x[N-1]\} {x[0],x[1],⋯,x[N−…...
Linux 存储设备和 Ventoy 启动盘制作指南
一、Linux 存储设备基础知识 1. 设备路径(/dev) 设备路径是 Linux 系统中物理存储设备的唯一标识,类似设备的"身份证号"。 命名规则解析 /dev/sda: /dev:device(设备)的缩写&…...
第14章:Python TDD应对货币类开发变化(一)
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
网络协议入门:OSI模型与TCP/IP栈
在网络通信的世界中,数据从一台设备传输到另一台设备,需要遵循一系列规则,这些规则统称为网络协议。OSI模型和TCP/IP协议栈作为网络通信的基石,帮助我们理解数据传输的全流程。这篇文章将深入解析它们的结构、功能和实际应用&…...
pthread_exit函数
pthread_exit 是 POSIX 线程库(pthread)中的一个函数,用于显式地终止调用线程。与 exit 函数不同,pthread_exit 仅影响调用它的线程,而不是整个进程。使用 pthread_exit 可以确保线程在退出时能够正确地释放线程相关的…...
从语音识别到图像识别:AI如何“看”和“听”
引言 随着人工智能技术的不断进步,AI的“听”和“看”能力正变得越来越强大。从语音识别到图像识别,AI不仅能够通过声音与我们互动,还能通过视觉理解和分析周围的世界。这些技术不仅改变了我们与机器的交互方式,也在各行各业中带…...
UML-对象图(Object Diagram)
定义 在UML(统一建模语言)中,对象图用于描述在某一时刻,一组对象以及它们之间关系的图形。它是系统详细状态在某一时刻的快照,常用于表示复杂的类图的一个实例。关联、依赖和继承是对象图中常见的三种关系,下面将对这三种关系进行详细说明,并阐述它们之间的区别。 Pla…...
Pytorch - YOLOv11自定义资料训练
►前言 本篇将讲解目前最新推出的YOLOv11搭配Roboflow进行自定义资料标注训练流程,透过Colab上进行实作说明,使大家能够容易的了解YOLOv11的使用。 ►YOLO框架下载与导入 ►Roboflow的资料收集与标注 进行自定义资料集建置与上传 透过Roboflow工具进行…...
大模型GUI系列论文阅读 DAY2续2:《使用指令微调基础模型的多模态网页导航》
摘要 自主网页导航的进展一直受到以下因素的阻碍: 依赖于数十亿次的探索性交互(通常采用在线强化学习),依赖于特定领域的模型设计,难以利用丰富的跨领域数据进行泛化。 在本研究中,我们探讨了基于视觉-语…...
Docker 搭建mysql 连接超时问题,xxl-job启动mysql连接报错,禁用dns
1.本地连接Navicat报错信息,猜测是navicat默认连接超时导致的,后面换成idea一个插件虽然慢但连接上了 2013 - Lost connection to MySQL server at reading initial communication packet 2.启动xxl-job会报错,网上有人mysql驱动与数据库不匹…...
SSM课设-学生管理系统
【课设者】SSM课设-学生管理系统 技术栈: 后端: SpringSpringMVCMybatisMySQLJSP 前端: HtmlCssJavaScriptEasyUIAjax 功能: 学生端: 登陆 学生信息管理 个人信息管理 老师端: 多了教师信息管理 管理员端: 多了班级信息管理 多了年级信息管理 多了系统用户管理...
JavaScript笔记APIs篇03——DOM节点Bom操作本地存储正则表达式
黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…...
JS 有哪些模块化规范
一、CommonJS 规范 1. 主要应用场景 主要用于服务器端开发,尤其是 Node.js 环境。 2. 核心思想 使用 require() 函数来引入模块,使用 module.exports 或 exports 对象来导出模块中的内容。 // math.js 模块const add (a, b) > a b;const subtr…...
摘录人工智能面试笔试题汇总
一、人工智能面试问答题汇总 1、什么是人工智能? 人工智能(AI)是一种计算机科学,它增强了像人类一样工作和反应的智能机器。机器模拟人类智能行为的能力。人工智能通常用于各种应用,如决策、语音识别、感知、认知能力…...
【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】
文章目录 1 什么是 MCTP?2 MCTP 消息在 PCIe 中的传输特点3 PCIe MCTP 的局限性(1) 出站(Outbound)MCTP 消息分解的限制(2) 入站(Inbound)MCTP 消息组装的限制4 MCTP 消息的实际使用流程发送端处理流程接收端处理流程5 实际使用场景例 1:管理命令传输例 2:监控数据报告例…...
RabbitMQ集群安装rabbitmq_delayed_message_exchange
1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章: rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后,start_app 就会报错了 (CaseC…...