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

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型

作者:王世发,吴艳兴等,58同城数据架构部

导读:

本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎,增强数据湖的分析能力。在迁移过程中,团队克服了多个兼容性问题,并对系统进行了稳定性和易用性的改进,特别是在Java UDF支持和SQL黑名单功能方面。

项目实施一年多以来,58同城取得了显著的成果:

  • 日均迁移SQL数量约 6.5 万条 ,查询成功率稳定在 98% 以上

  • 查询性能较迁移前提升 20 倍以上 ,平均查询时间缩短至 3.3 秒 ,P90查询时间为 5 秒

1 背景

“数据探查平台”是 58集团统一的 SQL 开发平台,旨在提供一个便捷的环境,让用户能够轻松编写、调试和执行 SQL 查询,并实时查看结果,每天超过10万+SQL 运行,包括 ETL,AdHoc 等场景,针对存储在 HDFS 上的海量数据查询,其底层执行引擎是由我们数据架构部门来提供的技术支持。

1.1 执行引擎原有架构

在引入 StarRocks 引擎之前,针对存储在 HDFS 上的海量数据查询,底层执行引擎的整体架构如下:

图片

在该架构下,大部分的探查 SQL 是通过 Spark 来执行的,少部分查询会路由到 Hive,查询响应时间整体在分钟级,随着公司对降本增效需求的日益增长,这已经无法满足即席查询(Ad-Hoc)对快速响应时间的要求,因此 Ad-Hoc 查询加速就成为亟待解决的问题。

1.2 探查场景引入 StarRocks 引擎

经过深入调研与评估后,我们最终选择了 StarRocks 作为我们数据探查场景的加速引擎,主要基于以下几个原因:

  • 统一数据湖分析能力: 我们只需要简单的创建一个 Hive Catalog,即可实现无缝衔接查询 Hive 表的数据,无需经过复杂的数据预处理。

  • MPP 框架与向量化执行引擎: 可以大大提升 Ad-Hoc 查询速度,综合官方基准测试结果及我们内部 POC 测试结果,使用 StarRocks 引擎,可以将查询性能提升 10 倍以上。

  • 架构简洁: StarRocks 架构简洁,运维成本较低。

引入 StarRocks 引擎后,数据探查执行引擎的整体架构如下:

图片

当有查询请求到来时,Kyuubi 会首先根据路由规则判断是否可以使用 StarRocks 执行。如果查询满足 StarRocks 的执行要求,我们将优先使用 StarRocks 进行处理。如果在 StarRocks 执行期间遇到异常情况,系统会自动降级到 Spark 执行,以确保用户的查询结果不会受到影响。

我们的整体目标是尽可能多地将数据探查 SQL 透明地迁移到 StarRocks 引擎,并且该过程对用户来说是无感知的,下文将围绕探查 SQL 迁移到 StarRocks 引擎过程中,遇到的一系列问题及其解决方案展开详细讲解。

2 StarRocks 兼容 Spark 改造

在推进探查 SQL 迁移过程中,遇到的最主要的问题就是 StarRocks 与 Spark 查询结果不一致的问题。为了确保迁移过程对用户透明无感知,我们就需要对 StarRocks 进行改造,使其能够兼容 Spark的执行逻辑。

虽然不同查询引擎在架构上存在差异,但概括起来 SQL 语句的执行流程无外乎如下几个步骤:

图片

而在我们迁移过程中遇到的 StarRocks 与 Spark 不兼容问题,基本上贯穿了上面整个执行流程,下面我将按照上述执行流程,依次讲解每个环节中我们发现并解决的不兼容问题。

2.1 语法解析阶段

语法解析阶段主要工作是将查询语句转化成语法树,在这个阶段我们遇到的主要问题就是语法不兼容问题,概括起来包括以下两类问题:

  • 语法不兼容问题

在迁移过程中,语法不兼容问题是比较常见的问题。对于一些相对容易解决的问题,我们通过直接修改 StarRocks 源码来向 Spark 兼容。例如,Spark 对表别名的大小写不敏感,而 StarRocks 则是大小写敏感的。针对这种情况,我们对 StarRocks 源码进行了相应的修改。

对于另一部分语法不兼容问题,我们是通过在 FE 端集成 SQLGlot 插件修复的,该插件能够实现查询语句在不同的 SQL 方言之间相互转换。例如,一些标识符如 key、show、system、group 等,在 Spark 中是可以在 SQL 语句中直接使用的,但在 StarRocks 中会被识别为关键字,无法直接使用。通过 SQLGlot 插件,可以将 SQL 语句中的这些标识符都加上反引号(`),从而使其在 StarRocks 中可以正常执行。

  • 语法不支持问题

对于 Spark 的一些高阶语法,如 LATERAL VIEW 语法、GROUP BY ... WITH CUBE 语法以及 GROUP BY ... GROUPING SETS(...) 语法,StarRocks 社区版本目前尚不支持,但是在我们的线上业务中,这部分语法的使用还是很频繁的。针对这些问题,我们扩展了 StarRocks 的能力,使其能够支持这些语法。

2.2 元数据绑定阶段

在元数据绑定阶段,主要工作是将 SQL 语句中的标识符(如表名、列名等)与数据库的实际元数据进行关联。在这个阶段,我们遇到的主要问题是由于 StarRocks 的 Hive Catalog 默认开启了元数据的缓存,导致的查询结果不一致问题。

例如,当 Hive 表的某个分区数据被重跑后,StarRocks 在一段时间内无法感知到分区元数据的变更,从而导致查询结果不一致。

针对这一问题,经过综合分析后,我们最终决定关闭了 Hive Catalog 的所有元数据缓存功能,这一决定看似简单粗暴,但主要基于以下两点考虑:

  1. 我们当前所做的工作是将一部分原来由 Spark 执行的查询迁移到 StarRocks 上执行,而 Spark 本身也并不缓存 Hive 表的元数据,因此即使关闭了 Hive Catalog 的元数据缓存功能,也并不会增加 Hive MetaStore 的整体访问量。

  2. 当前我们线上业务的查询并发并不高,缓存元数据并不会带来显著的收益。相反,如果开启了元数据缓存,并且查询了一些分区数很多的 Hive 表(一般为多级分区表),后续元数据缓存功能会周期性的刷新缓存中的元数据,这样反而会增加 Hive MetaStore 的负担。

2.3 查询优化阶段

在查询优化阶段,主要工作是基于 RBO(基于规则的优化)和 CBO(基于成本的优化)对执行计划进行重写,以获取最优的执行计划,提高查询性能。在这个阶段,遇到的主要问题是隐式转换问题。

在 RBO 规则中,有一类隐式转换规则,可以在优化查询时自动进行数据类型转换。例如,假设有一个分区表 t1,分区字段 dt 为字符串类型。如果用户在查询 t1 表时使用数值类型的分区过滤条件,如 where t1.dt = 20241201,那么针对这种不规范的用法,Spark 和 StarRocks 都会使用各自的隐式转换规则进行数据类型转换。

针对这类问题,我们系统的梳理了 Spark 和 StarRocks 在各类表达式中的隐式转换规则,并将StarRocks 的隐式转换规则与 Spark 进行了兼容,基本上彻底解决了这一类问题。

2.4 查询执行阶段

在查询优化阶段结束后,会生成一个由各种算子构成的查询计划树,在查询执行阶段,主要工作是在执行端执行这一系列的算子,例如 Scan 算子负责从存储层读取数据,Expr 算子负责进行表达式计算。在这个阶段遇到的兼容性问题也是最多的,概括起来主要包括如下两类问题:

text 格式的 Hive 表兼容性问题

在我们的生产环境中,有相当一部分 Hive 表使用的是 text+lzo 存储格式。针对这种存储格式,StarRocks 支持的并不完善,例如,早期 StarRocks 版本不支持查询 lzo 压缩的 text 格式的 Hive 表。为了解决这个问题,我们与 StarRocks 社区积极合作,扩展了 StarRocks 对 text+lzo 存储格式的支持。

另外,对于 text 格式的 Hive 表,StarRocks 社区版本也不支持查询 Map 类型的字段,我们也扩展了StarRocks 的能力,使其能够支持对 Map 类型字段的查询。

除此之外,我们还遇到了一些其他的兼容性问题,例如:

  • hive 表字段分隔符问题: 在某些特殊情况下,StarRocks 在处理 Hive 表字段分隔符时与 Spark 存在不兼容的情况。

  • 临时文件处理问题: StarRocks 在查询 Hive 表时没有忽略存储目录下的临时文件。

  • 空文件处理问题: StarRocks 在解压缩空文件时会抛出异常。

针对这些问题,我们都一一进行了修复,确保了 StarRocks 能够正确处理这些特定的场景。

函数不兼容问题

函数不兼容问题也是我们在迁移过程中花费最多精力处理的问题。具体又可以细分为以下两类:

  1. Spark 与 StarRocks 都有相同功能的函数,但是函数名称不同

这类函数处理起来比较简单,只需要在生成执行计划时,将 Spark 中的函数映射到 StarRocks 具有相同功能的函数即可。

  1. Spark 支持但 StarRocks 不支持或不兼容的函数

对于这类问题,我们采取了两种方式进行处理:

  • 逻辑简单的函数 :我们通过借助 StarRocks Java UDF 功能,创建 UDF 并在生成执行计划时将这些函数映射到自己实现的 Java UDF 函数来解决。

  • 逻辑复杂的函数 :我们直接修改 StarRocks 相关函数的代码,使其兼容 Spark 函数的处理逻辑。

通过以上方法,我们共计解决了 40 多个不兼容的函数,主要涉及日期处理,字符串处理,正则匹配,聚合函数等函数,基本上彻底解决了生产环境中存在的函数不兼容问题。

3 实践经验总结

在使用 StarRocks 的过程中,我们从实践中总结出了关于性能、稳定性和易用性的关键经验。

3.1 性能

我们的 StarRocks 集群开启了 Data Cache 功能,以提升查询性能。整体表现令人满意,但在个别场景中,查询性能受到 HDFS DataNode 慢节点问题的影响,出现了性能长尾现象。

针对这一问题,我们采用了自研的 HDFS 功能。当系统检测到某个 DataNode 响应缓慢时,会自动切换至其他副本读取数据。为实现这一功能,我们替换了 StarRocks 依赖的 HDFS JAR 包。经过优化后,系统的 P99 查询性能提升了 25%,效果显著。

3.2 稳定性

在项目初期,我们使用的是 StarRocks 3.0 版本,我们遇到了一些挑战,例如 FE 卡死或 BE 节点偶发性异常等。通过与 StarRocks 社区的积极交流,我们获得了社区的大力支持,并在升级至 StarRocks 3.2 后,整体系统的稳定性有了明显的提升。

其中,一个值得分享的案例是关于 CBO 统计信息的问题。在查询一张包含 3565 列的大宽表时,CBO 优化器会生成一个较大的 SQL 来获取统计信息,这可能导致 FE 内存占用过高,影响集群的正常运行。

针对这一情况,我们优化了相关逻辑,跳过了部分非必要的统计信息查询。这一改进有效降低了查询负载,同时进一步提升了系统的稳定性。

注意:稳定性问题在最新版本已优化。

3.3 易用性

为提升系统的操作便利性,我们对以下功能进行了优化:

  • Java UDF 支持从 HDFS 下载 JAR 包

增强了 UDF 功能,使 JAR 包可通过 HDFS 下载,简化了运维流程。

  • SQL 黑名单持久化

改进黑名单存储方式,实现多节点同步和持久化,降低了运维成本。

4 StarRocks 上云

4 .1 背景

为了进一步推进公司的降本增效战略,我们部门与 58 云平台团队进行通力合作,决定将一部分大数据组件迁移到 58 云平台。而对于 StarRocks 本身来说,数据探查场景主要借助其数据湖分析能力查询 Hive 表数据,集群本身是无状态的,并不会存储数据,天然就适合上云,因此我们决定将数据探查场景的 StarRocks 集群上云。

然而,由于各种情况的限制,上云使用的宿主机每台只能提供最多 5CORE 15GB 的资源。这给 StarRocks 的上云之路带来了一些挑战。

4 .2 上云架构

图片

上图为 StarRocks 云集群的整体架构:

  • 由于每个容器使用的资源限制在 5CORE 15GB,而 FE 节点需要存储集群的元数据,对内存资源要求较高,因此FE节点我们并没有上云,仍然使用物理机部署。

  • BE 集群只是为了存储审计日志表数据,需要开启云集群本地存储,只部署了少量实例。

  • CN 集群是主要的计算节点,无状态,支持快速的扩缩容。

4 .3 面临的挑战

上云过程中遇到的最大挑战就是容器内存资源不足,这导致 CN 节点容器频繁发生 OOM,被操作系统杀死。为了解决这一问题,我们采取了以下措施:

1 设置资源组隔离及查询队列

通过设置资源组隔离和查询队列,控制查询并发,确保资源的合理利用。

2 开启中间结果落盘功能

开启中间结果落盘功能,将部分计算结果暂存到磁盘上,从而降低内存消耗。

3 减少 CN 进程执行 线程数

CN 进程中有一些与执行线程数相关的参数,默认值通常设置为机器 CPU 的核数。而在容器环境下,CN 进程识别出的 CPU 核数是宿主机整体的 CPU 核数。因此,我们需要根据容器的实际资源配置手动调整这些参数。

4 限制 CN 进程 JVM 内存

在使用 StarRocks 数据湖分析能力查询 Hive 表场景下,有一部分功能是通过 JNI 来实现的,例如读取 HDFS 文件,还有就是一些 JAVA UDF 的使用。然而,由于 JVM 默认堆内存的上限是根据物理机的内存自动设置的,这种默认行为并不适配容器化环境。因此,需要通过设置 CN 进程的 JAVA_OPTS 参数 来限制 JVM 内存的使用,从而确保 CN 进程 的整体内存消耗不会超出容器的内存限制。

通过采取以上一系列措施,基本上解决了因容器内存溢出导致的系统不稳定问题。

5 整体收益

项目实施一年多以来:

  • 目前日均透明迁移到 StarRocks 集群的有效 SQL 数量约为 6.5W 条。

  • 路由到 StarRocks 集群的 SQL,整体查询成功率稳定在 98% 以上。

  • 已迁移的 SQL 中,平均查询时间在 3.3s 左右,P90 查询时间在 5s 左右,P99 查询时间在 52s 左右。

图片

  • 与迁移前相比,平均查询性能提升了 20 倍以上,查询体验得到了很大的提升。

图片

后续我们也将不断进行迭代,持续发现并解决 StarRocks 与 Spark 的兼容性问题,使得更多的 SQL 能够透明地迁移到 StarRocks 集群。

6 后续规划

统计发现,在我们的数据探查场景中,有相当一部分 SQL 是直接对明细表进行聚合和关联查询,并没有经过数仓建模。这种查询方式不仅效率低下,而且类似的复杂查询重复执行也在很大程度上浪费了计算资源。

如果能够根据这些类似的复杂查询自动提取出公共子查询来创建物化视图,并借助 StarRocks 的物化视图透明改写能力,就可以有效解决这一问题。

事实上,我们已经在进行智能物化视图方面的探索,并将持续关注社区在这方面的进展,尽快完成智能物化视图能力的落地,以助力降本增效战略的持续推进。

更多交流,联系我们:StarRocks

相关文章:

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型

作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…...

网络知识小科普--5

81、什么是组播路由? 组播路由是一种有针对性的广播形式,将消息发送到所选择的用户组,而不是将其发送到子网上的所有用户。 82、加密在网络上的重要性是什么? 加密是将信息转换成用户不可读的代码的过程。然后使用秘密密钥或密码将其翻译或解密回其…...

【JWT】jwt实现HS、RS、ES、ED签名与验签

JWT 实现 HS、RS、ES 和 ED 签名与验签 签名方式算法密钥类型签名要点验签要点HSHMAC-SHA256对称密钥- 使用 crypto/hmac 和对称密钥生成 HMAC 签名- 将 header.payload 作为数据输入- 使用同一密钥重新计算 HMAC 签名- 比较计算结果与接收到的签名是否一致RSRSA-SHA256公钥 …...

cherry USB 键盘分析

文章目录 cherry USB 键盘分析描述符结构设备描述符配置描述符集合配置描述符接口 1 描述符HID 描述符端点 IN 描述符接口 2 描述符HID 描述符端点 IN 描述符端点 OUT 描述符字符串描述符语言 ID (字符串索引为 0)厂商字符串(字符串索引为 1)产品字符串(字符串索引为 2)HID 报告…...

R语言学习笔记之高效数据操作

一、概要 数据操作是R语言的一大优势,用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作,包括排序、更新、分组汇总等。R数据操作包:data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具,可以实现快…...

高阶C语言|数组名的深度解析(数组名结合sizeof与strlen的详解)

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴…...

Vue3 v-bind 和 v-model 对比

1. 基本概念 1.1 v-bind 单向数据绑定从父组件向子组件传递数据简写形式为 : 1.2 v-model 双向数据绑定父子组件数据同步本质是 v-bind 和 v-on 的语法糖 2. 基础用法对比 2.1 表单元素绑定 <!-- v-bind 示例 --> <template><input :value"text&quo…...

科家多功能美发梳:科技赋能,重塑秀发新生

在繁忙的都市生活中,头皮健康与秀发养护成为了现代人不可忽视的日常课题。近日,科家电动按摩梳以其卓越的性能和创新设计,赢得了广大消费者的青睐。这款集科技与美学于一身的美发梳,不仅搭载了2亿负离子、6000次/分钟的声波振动等前沿技术,更融入了650nm聚能环红光与415nm强劲蓝…...

systemverilog中的force,release和assign

1 assign assign 语句用于为 wire 类型的信号提供连续赋值。它建立了一个驱动源&#xff0c;根据右侧表达式的值持续驱动 wire 信号。 module Example;wire a, b, c;assign c a & b; endmodule 2 force force 用于强制将一个信号的值设定为某个特定值&#xff0c;会覆盖…...

9【如何面对他人学习和生活中的刁难】

我们在学习的过程中&#xff0c;会遇到很多来自于他人的刁难与嘲讽&#xff0c;如果处理不好&#xff0c;这会大大影响我们的心情&#xff0c;从而影响学习的效率 我建议&#xff0c;如果你学习或生活中也遇到了类似的问题&#xff0c;不要去生气&#xff0c;更不要发生冲突&a…...

新项目传到git步骤

1.首先创建远程仓库,创建一个空白项目,即可生成一个克隆URL,可以是http也可以是SSH,copy下这个地址 2.找到项目的本机目录,进入根目录,打开git bash here命令行 3.初始化: git init 4.关联远程地址: git remote add origin "远程仓库的URL" 5.查看关联 git re…...

docker搭建redis集群(三主三从)

本篇文章不包含理论解释&#xff0c;直接开始集群&#xff08;三主三从&#xff09;搭建 环境 centos7 docker 26.1.4 redis latest &#xff08;7.4.2&#xff09; 服务器搭建以及环境配置 请查看本系列前几篇博客 默认已搭建好三个虚拟机并安装配置好docker 相关博客&#xf…...

DDD架构实战第七讲总结:分层模型和代码组织

云架构师系列课程之DDD架构实战第七讲总结:分层模型和代码组织 一、引言 在前几讲中,我们介绍了领域驱动设计(DDD)的基本构造块和生命周期模型中的聚合。本讲将重点讨论如何将这些构造块和代码组织起来,探讨分层架构和六边形模型,以及如何组织代码结构。 二、工厂和资…...

LabVIEW太阳能照明监控系统

在公共照明领域&#xff0c;传统的电力照明系统存在高能耗和维护不便等问题。利用LabVIEW开发太阳能照明监控系统&#xff0c;通过智能控制和实时监测&#xff0c;提高能源利用效率&#xff0c;降低维护成本&#xff0c;实现照明系统的可持续发展。 ​ 项目背景 随着能源危机…...

C# 结构体

总目录 前言 在 C# 编程中&#xff0c;结构体&#xff08;struct&#xff09;是一种非常重要的数据结构&#xff0c;它为我们提供了一种轻量级的存储和操作数据的方式。本教程将带你深入了解结构体的概念、特点、使用方法&#xff0c;以及一些使用结构体的最佳实践。 一、什么…...

C++小病毒-1.0勒索(更新次数:1)

内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 在C20环境下,并在虚拟机里运行此代码!&#xff0c;病毒带来后果自负! 使用时请删除在main()里的注释,并修改位置至C:\\(看我代码注释)//可以改成WIN Main() #include <iostream> #i…...

RabbitMQ---面试题

常见面试题 1.MQ的作用及应用场景 类似问题&#xff1a;项目什么情况下用到了MQ&#xff0c;为什么要用MQ MQ的主要应用场景&#xff0c;消息队列的应用场景&#xff0c;为什么说消息队列可以削峰 首先MQ是一种用来接收和转发消息的队列&#xff0c;常见的应用常见如下&…...

CSS中相对定位和绝对定位详解

文章目录 CSS中相对定位和绝对定位详解一、引言二、相对定位1、相对定位的概念1.1、代码示例 三、绝对定位1、绝对定位的概念1.1、代码示例 四、相对定位与绝对定位的区别五、使用示例六、总结 CSS中相对定位和绝对定位详解 一、引言 在CSS布局中&#xff0c;定位是一种强大的…...

【深度学习基础】多层感知机 | 权重衰减

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

[cg] 使用snapgragon 对UE5.3抓帧

最近想要抓opengl 的api&#xff0c;renderdoc在起应用时会闪退&#xff08;具体原因还不知道&#xff09;&#xff0c;试了下snapgraon, 还是可以的 官网需要注册登录后下载&#xff0c;官网路径&#xff1a;Developer | Qualcomm 为了方便贴上已经下载好的exe安装包&#x…...

Java 集合框架介绍

Java学习资料 Java学习资料 Java学习资料 在 Java 编程中&#xff0c;集合框架是一个强大且常用的工具&#xff0c;它为存储和操作一组对象提供了统一的体系结构。通过集合框架&#xff0c;我们能够高效地管理数据&#xff0c;提升程序的灵活性和可维护性。 一、集合框架的概…...

【博客之星】2024年度创作成长总结 - 面朝大海 ,春暖花开!

没关系的&#xff0c;大家都会做错选择&#xff0c;会 莫名其妙掉眼泪&#xff0c;走在路上会突然崩溃&#xff0c; 但这并不影响我们去看看晚霞&#xff0c; 再次爱上这个世界。 面朝大海 &#xff0c;春暖花开! about meReviewLife about me 现在我是一名24级计算机类的…...

windows11关闭系统更新详细操作步骤

文章目录 1.打开注册表2.修改注册表内容2.1 新建文件2.2 修改值 3.修改设置 1.打开注册表 winR输入regedit(如下图所示) 2.修改注册表内容 进HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 2.1 新建文件 右侧界面右键即可 2.2 修改值 重命名为如下…...

医学图像分析工具09.1:Brainstorm安装教程

1. 安装前准备 **官方安装包和数据&#xff1a;**https://neuroimage.usc.edu/bst/download.php **官方安装教程&#xff1a;**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求&#xff1a; 有 Matlab&#xff1a; R2009b (7.9) 或更高版本没有 Matlab&…...

蚁群算法 (Ant Colony Optimization) 算法详解及案例分析

蚁群算法 (Ant Colony Optimization) 算法详解及案例分析 目录 蚁群算法 (Ant Colony Optimization) 算法详解及案例分析1. 引言2. 蚁群算法 (ACO) 算法原理2.1 蚂蚁觅食行为2.2 算法步骤2.3 数学公式3. 蚁群算法的优势与局限性3.1 优势3.2 局限性4. 案例分析4.1 案例1: 旅行商…...

鸿蒙next 自定义日历组件

效果图预览 20250124-113957 使用说明 1.选择日期左右箭头&#xff0c;实现每月日历切换&#xff0c;示例中超出当前月份&#xff0c;禁止进入下一月&#xff0c;可在代码更改 2.日历中显示当前选择的日期&#xff0c;选中的日期颜色可自定义 3.日历中可展示历史记录作为数据…...

Android BitmapShader简洁实现马赛克,Kotlin(二)

Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;二&#xff09; 这一篇 Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;一&#xff09;-CSDN博客 遗留一个问题&#xff0c;xml定义的MyView为wrap_content的宽高&#xff0c;如果改成其…...

MATLAB编写遗传算法【Genetic Algorithm(GA)】求解函数最大值

一、遗传算法基础知识 来自B站视频的笔记&#xff1a; 【超容易理解】手把手逐句带你解读并实现遗传算法的MATLAB编程&#xff08;结合理论基础&#xff09;_哔哩哔哩_bilibili 1、遗传算法 使用“适者生存”的原则&#xff0c;在遗传算法的每一代中&#xff0c;…...

remove和delete应用场景

"Remove" 和 "delete" 都有“移除、去除”的意思&#xff0c;但它们在使用时有一些细微的区别&#xff0c;通常根据上下文来决定使用哪一个。以下是它们的主要区别&#xff1a; 1. Remove "Remove" 是一个相对通用的词&#xff0c;指的是从某个…...

Redis 详解

简介 Redis 的全称是 Remote Dictionary Server&#xff0c;它是一个基于内存的 NoSQL&#xff08;非关系型&#xff09;数据库&#xff0c;数据以 键值对 存储&#xff0c;支持各种复杂的数据结构 为什么会出现 Redis&#xff1f; Redis 的出现是为了弥补传统数据库在高性能…...

亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘

解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal&#xff0c;选择版本后点击“install”执行安装...

Java 设计模式 二 单例模式 (Singleton Pattern)

单例模式 (Singleton Pattern) 是一种常见的设计模式&#xff0c;属于创建型模式。它的核心思想是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景&#xff0c;比如配置管理、日志系统、数据库连接池等。 1. 单例模式的…...

golang网络编程

socket编程 socket图解 Socket是BSD UNIX的进程通信机制&#xff0c;通常也称作”套接字”&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄。Socket可以理解为TCP/IP网络的API&#xff0c;它定义了许多函数或例程&#xff0c;程序员可以用它们来开发TCP/IP网…...

kotlin内联函数——takeIf和takeUnless

1.takeIf 当对一个对象调用takeIf时&#xff0c;如果对象满足给定的判断条件&#xff0c;则返回该对象&#xff1b;否则&#xff0c;返回null。因此&#xff0c;takeIf是对单个对象进行过滤的函数。例如&#xff0c; class User {var name: String? nullvar age 99fun set…...

计算机网络 (54)系统安全:防火墙与入侵检测

前言 计算机网络系统安全是确保网络通信和数据不受未经授权访问、泄露、破坏或篡改的关键。防火墙和入侵检测系统&#xff08;IDS&#xff09;是维护网络系统安全的两大核心组件。 一、防火墙 定义与功能 防火墙是一种用来加强网络之间访问控制的特殊网络互联设备&#xff0c;它…...

第38周:猫狗识别 (Tensorflow实战第八周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 六、模型评估 七、预测 总结 前言…...

【力扣Hot 100】矩阵1

矩阵置零&#xff1a;1. 开两个数组判断该行/该列是否有0&#xff1b;2. 用第0行/第0列分别判断该列/该行是否有0 螺旋矩阵&#xff1a;记录方向&#xff0c;一直按某方向前进&#xff0c;遇到障碍方向就变一下 1. 矩阵置零 给定一个 *m* x *n* 的矩阵&#xff0c;如果一个元…...

量子编程语言:Qiskit 与 Cirq

在量子计算的领域&#xff0c;开发者已经可以使用一些专门为量子计算设计的编程语言和框架。其中&#xff0c;Qiskit 和 Cirq 是两个非常流行的选择&#xff0c;它们为不同的量子计算机提供编程接口&#xff0c;帮助开发者理解量子电路的设计和执行。 1. Qiskit Qiskit 是 IBM…...

leetcode 124. 二叉树中的最大路径和

题目&#xff1a;124. 二叉树中的最大路径和 - 力扣&#xff08;LeetCode&#xff09; 定义一个节点的“最大单向路径和”是single&#xff0c;single有以下几种情况&#xff1a; 只有该节点该节点左儿子的single该节点右儿子的single 设答案是节点 node 为根节点&#xff0…...

程序员转型测试:解锁漏洞挖掘新旅程

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 程序…...

基于Springboot用axiospost请求接收字符串参数为null的解决方案

问题 ​ 今天在用前端 post 请求后端时发现&#xff0c;由于是以 Json对象的形式传输的&#xff0c;后端用两个字符串形参无法获取到对应的参数值 前端代码如下&#xff1a; axios.post(http://localhost:8083/test/postParams,{a: 1, b:2} ,{Content-Type: application/jso…...

# AI绘图中的Embedding、CLIP、Flux中的Clip与LCM SDXL加速生成解析

AI绘图中的Embedding、CLIP、Flux中的Clip与LCM SDXL加速生成解析 在现代AI绘图和深度学习中&#xff0c;涉及了多个复杂的概念和技术&#xff0c;这些技术在图像生成、训练加速以及多模态学习等方面起着至关重要的作用。在这篇博客中&#xff0c;我们将讨论几个关键概念&…...

警企联动齐发力、共筑反诈“防护墙”

2025年1月10日是第五个中国人民警察节,南通移动联合南通公安反诈中心,深入社区商圈,开展防范电信网络诈骗宣传活动,进一步增强广大人民群众的反诈意识和能力,全力守护好群众的“钱袋子”。 当日,活动现场一大早就呈现出一片忙碌景象,工作人员支起摊位,将各类精心制作的反诈宣传…...

Node.js HTTP模块详解:创建服务器、响应请求与客户端请求

Node.js HTTP模块详解&#xff1a;创建服务器、响应请求与客户端请求 Node.js 的 http 模块是 Node.js 核心模块之一&#xff0c;它允许你创建 HTTP 服务器和客户端。以下是一些关键知识点和代码示例&#xff1a; 1. 创建 HTTP 服务器 使用 http.createServer() 方法可以创建…...

Alibaba Spring Cloud 十七 Sentinel熔断降级

概述 在微服务架构中&#xff0c;熔断与降级是保证系统稳定性的重要机制&#xff0c;能有效防止故障蔓延或雪崩效应。当某个服务出现异常、延迟过高或错误率过高时&#xff0c;触发熔断保护&#xff0c;将该服务“隔离”一段时间&#xff0c;避免影响整体系统的吞吐和可用性。 …...

linux——网络基础

文章目录 目录 文章目录 踏入网络世界&#xff1a;探索 Linux 网络的无垠天地 一、网络发展 早期单机处理模式 网络发展的需求催生 网络发展后的优势对比 二、局域网or广域网 典型局域网架构 广域网连接多个局域网 二者关系 三、协议 语言层与汉语协议 通信设备层与电话机协议 …...

Spring Boot 集成 WebClient 实战教程 实现同步、异步请求处理以及响应式编程、响应式流、响应式Mono

该项目介绍springboot集成WebClient 实现服务的请求操作 示例中演示了,如何配置WebClient的请求头,请求参数等相关参数,实现同步、异步请求处理以及响应式编程、响应式流、响应式Mono。 为什么使用WebClient 不用RestTemplate 在 Spring Framework 5.0 及更高版本中,Res…...

健身房项目 Uniapp+若依Vue3版搭建!!

本次系统实现主要负责前端前端功能的实现。其中系统前端主要分为三大部分&#xff0c;首页&#xff0c;教练列表页&#xff0c;我的页面。 首页 首页的实现效果如图 1.会员卡组件 首页的Vip会员卡部分&#xff0c;团课活动的DataPicker&#xff0c;团课选择都采用了组件化封…...

(2)STM32 USB设备开发-USB虚拟串口

例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为USB虚拟串口教程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的&#xff0c;如果代码中出现一些外设的…...

ubuntu上python setup.py install报错:error: expected initializer before ‘__s128’

问题场景&#xff1a;安装torchsparse时候执行python setup.py install 报错&#xff1a; /usr/include/linux/types.h:12:27: error: expected initializer before ‘__s128’12 | typedef __signed__ __int128 __s128 __attribute__((aligned(16)));| …...