Apache Storm入门介绍之三分钟看懂Apache Storm

news2024/9/19 10:45:16

文章目录

  • 0.前言
  • 1. 什么是 Apache Storm?
    • 1.1. Nimbus
    • 1.2. Zookeeper
    • 1.3. Supervisor
    • 1.4. Worker
    • 1.5 集群模式下各组件职责
  • 2. 核心概念
    • 2.1基本架构和任务模型
    • 2.2 工作流程
  • 3. 源码地址
    • 3.1. 代码结构
    • 3.1. 核心模块介绍
  • 4. Storm入门实例
    • 0.创建java工程并引入依赖
    • 1. 创建一个 `Spout `类,用于生成随机的社交媒体帖子数据,并将其发送到拓扑中的下一个组件(Bolt):
    • 2. 创建一个 Bolt 类,用于处理帖子数据,并计算每个帖子的情感倾向:
    • 3. 创建一个拓扑类,用于连接 Spout 和 Bolt,并设置拓扑的并发度:
    • 4.情感分析方法 analyzeSentiment
  • 5. Apache Storm 与 Hadoop
  • 6. Apache Storm 的用例
    • 使用的公司
  • 7. Apache Storm 的优点
    • 通俗的讲
  • 8. 参考文档

0.前言

我们大家想想目前与大数据相关的著名的开源组件有哪些呢?比如说最早期的批处理框架 Hadoop?流计算平台 Storm,火了一阵子的 Spark?异或其他领域数仓的 Hive,KV 存储的 HBase?这些都是非常著名的开源项目、我大概整理了一个图可供大家参考。而本章我们着重了解一下大数据领域的分布式实时数据处理老大哥Storm。虽然近年来 Apache Flink 成为了分布式实时数据处理领域的重要技术,并且在某些方面甚至超越了 Apache Storm。Flink 提供了更加高级的流处理和批处理功能,具有更好的性能和易用性。但是 Storm 仍然是一个非常有价值的技术,并且在各公司已经有了很深的技术沉淀和最佳实践,还支持着公司和客户的核心业务。Storm 具有更加灵活的编程模型和更加丰富的 API,可以满足各种实时数据处理的需求。Storm 也拥有一个庞大的社区和生态系统,支持各种数据源和数据处理工具的集成和扩展。因此,在选择实时数据处理技术时,应该根据具体需求进行综合评估,选择最适合自己的技术。本次我们分三个章节着重讲解一下。

在这里插入图片描述

1. 什么是 Apache Storm?

Apache Storm 是一个分布式实时计算系统,可以处理大规模实时数据流。它是一个开源项目,最初由 Twitter 开发并贡献给 Apache 软件基金会。Storm 提供了一个易于使用的编程模型,支持高效、可靠、可扩展的数据处理流程,广泛应用于实时数据分析、实时推荐、实时监控等领域。
在这里插入图片描述
从图中我们梳理出以下的关系

  • Nimbus 通过与 Zookeeper 的交互,管理 Storm 集群中的所有组件,包括 Supervisor 和 Worker。
  • Zookeeper 维护着 Storm 集群的状态和元数据,包括 Topology 的元数据、Worker 的状态、Supervisor 的信息等。
  • Supervisor 负责管理 Worker 进程,监控和维护 Worker 的状态和资源使用情况。
  • Worker 运行在 Supervisor 中,处理 Tuple 并将处理后的数据发送给下游的 Bolt 或者输出到外部存储系统。

在这里插入图片描述

1.1. Nimbus

Nimbus 是 Storm 的主节点,负责 Topology 的分配和调度。Nimbus 接收到 Topology 的提交请求后,会对 Topology 进行编译、打包和分发,然后将任务分配给集群中的 Supervisor 和 Worker。Nimbus 还负责监控和管理整个 Storm 集群的运行状态,例如监控 Worker 的状态、处理故障和异常、维护 Topology 的元数据等。

1.2. Zookeeper

Zookeeper 是 Storm 集群的分布式协调服务,负责管理集群中各个组件的状态和配置信息。Nimbus、Supervisor 和 Worker 都会将自己的状态和元数据注册到 Zookeeper 中,以便其他组件可以发现和访问它们。Zookeeper 还提供了分布式锁、协调和通知机制,能够保证 Storm 集群的高可用性和一致性。

1.3. Supervisor

Supervisor 是 Storm 集群中的工作节点,负责运行和管理 Worker 进程。每个 Supervisor 可以运行多个 Worker 进程,每个 Worker 进程运行一个或多个 Task。Supervisor 还负责监控 Worker 进程的状态和资源使用情况,例如 CPU、内存、磁盘等。

1.4. Worker

Worker 是 Storm 集群中的实际工作进程,负责具体的数据处理和传递工作。Worker 运行在 Supervisor 中,可以运行多个 Task。每个 Worker 负责处理一部分数据流,通过处理 Tuple 来实现实时数据处理和转换。Worker 还会将处理后的数据发送给下游的 Bolt 或者输出到外部存储系统。

1.5 集群模式下各组件职责

在这里插入图片描述

2. 核心概念

Apache Storm 是一个分布式实时计算系统,具有以下核心概念:
在这里插入图片描述

组件描述
TopologyStorm 中的最高级别的抽象概念,表示一个实时数据处理流程。Topology 由 Spout 和 Bolt 组成,可以看作是一个有向无环图(DAG),其中 Spout 是数据源,Bolt 是数据处理节点。
Spout流的来源,也叫做源节点,。一般来说,Storm 接受来自原始数据源的输入数据,如 Twitter Streaming API、Apache Kafka 队列、Kestrel 队列等。否则,您可以编写 spout 从数据源读取数据。“ISpout”是实现spout的核心接口,具体接口有IRichSpout、BaseRichSpout、KafkaSpout等。负责从数据源中读取实时数据流,并将数据流发送给下游的 Bolt 节点。Spout 可以从文件、数据库、消息队列、网络等不同的数据源中读取数据,并通过可靠的方式将数据发送给 Bolt 节点。
BoltBolts 是逻辑处理单元。Spout 将数据传递给 bolts 和 bolts 进程并产生一个新的输出流。Bolts 可以执行过滤、聚合、连接、与数据源和数据库交互的操作。Bolt 接收数据并发送到一个或多个 Bolt。“IBolt”是实现bolt的核心接口。一些常用的接口有 IRichBolt、IBasicBolt 等Topology 中的处理节点,负责对数据流进行实时处理和转换。Bolt 可以对数据流进行过滤、聚合、计算、转换等各种操作,并通过可靠的方式将处理后的数据发送给下游的 Bolt 节点或者输出到外部存储系统。
Stream数据流的抽象概念,表示一组有序的数据记录。Stream 可以包含多个字段,每个字段可以是不同的数据类型。Stream 是 Topology 中 Spout 和 Bolt 之间的通信载体,可以传递实时数据流和元数据信息。
TupleStorm 中的基本数据单元,表示一个有序的字段组成的数据记录。Tuple 可以看作是 Stream 中的一个数据元素,每个 Tuple 由多个字段组成,字段可以是不同的数据类型。Tuple 是 Storm 中数据处理和传递的基本单位。
TaskBolt 或者 Spout 在集群中的实例,负责具体的数据处理和传递工作。Topology 中的每个 Bolt 或者 Spout 都会被分配若干个 Task,每个 Task 负责处理一部分数据流。
WorkerStorm 集群中的一个进程,负责启动和运行一个或多个 Task。每个 Worker 可以运行在独立的机器上,也可以运行在同一台机器上的不同进程中。

在这里插入图片描述
来自官网

2.1基本架构和任务模型

根据下图,我们来理解一下Storm 核心组件的作用和关系。
在这里插入图片描述

2.2 工作流程

在这里插入图片描述

3. 源码地址

源码地址 https://github.com/apache/storm

3.1. 代码结构

在这里插入图片描述

3.1. 核心模块介绍

目录描述
storm-buildtools构建和测试 Storm 项目的工具和脚本
storm-checkstyle代码风格检查的 Checkstyle 配置文件和规则
storm-client与 Storm 集群通信的客户端 API
storm-clojure-test用于测试 Clojure 代码的测试工具和框架
storm-clojureStorm 中使用的 Clojure 代码
storm-coreStorm 的核心功能和算法的实现代码
storm-dist构建分发包的相关文件和配置
storm-multilang与非JVM语言通信的多语言支持
storm-server启动和管理 Storm 服务器的代码
storm-shaded-depsStorm 所需的各种第三方依赖的 shaded 版本
storm-submit-tools提交和管理 Storm 拓扑的工具和脚本
storm-webappStorm 的 Web UI 的代码和资源文件

4. Storm入门实例

说了那么多概念,我们来搞个代码来感受一下。我们假设有这样的一个场景,就比如CSDN的博文评价或者论坛帖子分析,核心场景是分析CSDN平台上用户对不同话题的情感倾向。
我们用java来实现.在控制台上,可以看到每个帖子及其情感倾向的输出结果。 这只是一个简单的情感分析示例,并且仅基于词语的出现与否进行判断。在实际应用中,情感分析通常会使用更复杂的算法和语言模型来进行更精确的情感判断。请大家不要上纲上线

0.创建java工程并引入依赖

添加Storm的依赖。

  <dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>2.2.0</version>
  </dependency>

1. 创建一个 Spout 类,用于生成随机的社交媒体帖子数据,并将其发送到拓扑中的下一个组件(Bolt):

public class SocialMediaSpout extends BaseRichSpout {
  private SpoutOutputCollector collector;
  
  @Override
  public void open(Map<String, Object> conf, TopologyContext context, SpoutOutputCollector collector) {
    this.collector = collector;
  }
  
  @Override
  public void nextTuple() {
    // 生成随机的社交媒体帖子数据
    String post = generateRandomPost();
    
    // 发送数据到下一个组件
    collector.emit(new Values(post));
  }
  
  private String generateRandomPost() {
    // 实现随机生成帖子的逻辑
    // 返回生成的帖子内容
  }
  
  @Override
  public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("post"));
  }
}

2. 创建一个 Bolt 类,用于处理帖子数据,并计算每个帖子的情感倾向:

public class SentimentAnalysisBolt extends BaseRichBolt {
  private OutputCollector collector;
  
  @Override
  public void prepare(Map<String, Object> conf, TopologyContext context, OutputCollector collector) {
    this.collector = collector;
  }
  
  @Override
  public void execute(Tuple tuple) {
    // 获取帖子数据
    String post = tuple.getStringByField("post");
    
    // 进行情感分析,计算情感倾向
    double sentiment = analyzeSentiment(post);
    
    // 发送情感倾向数据到下一个组件
    collector.emit(new Values(post, sentiment));
    
    // 确认处理成功
    collector.ack(tuple);
  }
  
  private double analyzeSentiment(String post) {
    // 实现情感分析的逻辑
    // 返回计算得到的情感倾向值
  }
  
  @Override
  public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("post", "sentiment"));
  }
}

3. 创建一个拓扑类,用于连接 Spout 和 Bolt,并设置拓扑的并发度:

public class SentimentAnalysisTopology {
  public static void main(String[] args) throws Exception {
    // 创建拓扑
    TopologyBuilder builder = new TopologyBuilder();
    
    // 设置 Spout 和 Bolt
    builder.setSpout("socialMediaSpout", new SocialMediaSpout(), 2);
    builder.setBolt("sentimentAnalysisBolt", new SentimentAnalysisBolt(), 4).shuffleGrouping("socialMediaSpout");
    
    // 创建配置
    Config config = new Config();
    config.setDebug(true);
    
    // 提交拓扑到 Storm 集群
    StormSubmitter.submitTopology("sentiment-analysis-topology", config, builder.createTopology());
  }
}

4.情感分析方法 analyzeSentiment

它接受一个字符串作为输入,并返回一个表示情感极性的整数值。具体实现如下:
首先定义了一个积极词汇数组和一个消极词汇数组,然后遍历输入文本中的每个单词。使用 Arrays.asList 方法将数组转换为 List,并使用 contains 方法检查单词是否在列表中。如果单词在积极词汇列表中,情感分数加1;如果单词在消极词汇列表中,情感分数减1。最后返回情感分数作为结果。

public class SentimentAnalyzer {
    public static int analyzeSentiment(String text) {
        String[] positiveWords = {"开心", "真棒", "支持", "优秀", "好文", "厉害"};
        String[] negativeWords = {"三连", "互粉", "垃圾", "差" ,"废话"};
        
        int sentimentScore = 0;
        
        String[] words = text.split(" ");
        for (String word : words) {
            if (Arrays.asList(positiveWords).contains(word)) {
                sentimentScore += 1;
            } else if (Arrays.asList(negativeWords).contains(word)) {
                sentimentScore -= 1;
            }
        }
        
        return sentimentScore;
    }
}

5. Apache Storm 与 Hadoop

Apache Storm 和 Hadoop 都是大数据处理领域的重要技术。但是,它们的设计目标和应用场景有所不同。Hadoop 是一个批处理系统,主要用于离线数据处理,例如批量的 MapReduce 任务和数据仓库。而 Storm 是一个实时计算系统,主要用于处理实时数据流,例如实时的流处理、实时的事件处理和实时的机器学习。

StormHadoop
实时流处理批量处理
无状态有状态的
具有基于 ZooKeeper 协调的主/从架构。主节点称为nimbus和从节点称为supervisors.具有/不具有基于 ZooKeeper 的协调的主从架构。主节点是job tracker从节点是task tracker.
Storm 流式处理可以在集群上每秒访问数万条消息。Hadoop 分布式文件系统 (HDFS) 使用 MapReduce 框架来处理需要数分钟或数小时的大量数据。
Storm Topology会一直运行,直到用户关闭或出现不可恢复的意外故障。MapReduce 作业按顺序执行并最终完成。
两者都是分布式和容错的
如果 nimbus / supervisor 死了,重新启动会使其从停止的地方继续,因此不会受到任何影响。如果 JobTracker 死了,所有正在运行的作业都将丢失。

6. Apache Storm 的用例

Apache Storm 可以用于处理各种实时数据流,包括社交媒体数据、物联网数据、金融数据、移动应用数据等。以下是一些常见的用例:

  • 实时数据分析和决策:Storm 可以对海量实时数据进行分析和决策,例如实时交易监控、实时风控分析、实时广告投放等。
  • 实时推荐和个性化服务:Storm 可以根据用户的实时行为和偏好,提供个性化的推荐和服务,例如实时新闻推荐、实时电影推荐等。
  • 实时监控和预警:Storm 可以对实时数据流进行监控和预警,例如实时网络监控、实时系统监控等。
  • 实时机器学习和模型训练:Storm 可以在实时数据流中更新机器学习模型和进行模型训练,例如实时预测和实时识别。

使用的公司

Twitter− Twitter 在其“发布者分析产品”系列中使用 Apache Storm。“发布者分析产品”处理 Twitter 平台中的每条推文和点击。Apache Storm 与 Twitter 基础架构深度集成。

NaviSite− NaviSite 正在将 Storm 用于事件日志监控/审计系统。系统中产生的每一条日志都会经过Storm。Storm 将根据配置的正则表达式集检查消息,如果匹配,则该特定消息将保存到数据库中。

Wego− Wego 是位于新加坡的旅游元搜索引擎。旅行相关数据来自世界各地不同时间的许多来源。Storm 帮助 Wego 搜索实时数据,解决并发问题并为最终用户找到最佳匹配。
来自网络

7. Apache Storm 的优点

Apache Storm 具有以下好处:

  • 实时性:Storm 可以处理实时数据流,并实现毫秒级的响应时间。
  • 可靠性:Storm 提供了可靠的消息传递机制和故障恢复机制,能够保证数据处理的高可靠性。
  • 可扩展性:Storm 可以通过水平扩展来支持大规模的数据处理流程,能够便捷地扩展节点数和集群规模。
  • 易用性:Storm 提供了易于使用的编程模型和丰富的 API,能够简化开发和部署的过程。
  • 生态系统:Storm 有一个庞大的开源生态系统,支持各种数据源和数据处理工具的集成和扩展。

通俗的讲

  • Storm 是开源的、强大的和用户友好的。它可以在小公司和大公司中使用。
  • Storm 容错、灵活、可靠,并且支持任何编程语言。
  • 允许实时流处理。
  • Storm 的速度快得令人难以置信,因为它具有强大的数据处理能力。
  • Storm 通过线性添加资源,即使在负载增加的情况下也能保持性能。它具有高度可扩展性。
  • Storm 在几秒或几分钟内执行数据刷新和端到端交付响应,具体取决于问题。它的延迟非常低。
  • Storm 拥有运营智能。
  • 即使集群中的任何连接节点死亡或消息丢失,Storm 也提供有保证的数据处理。

8. 参考文档

  1. Apache Storm 官方文档:https://storm.apache.org/releases/2.4.0/index.html
  2. Storm 启动指南:https://storm.apache.org/releases/2.2.0/Running-topologies-on-a-production-cluster.html
  3. Storm Topology 设计指南:https://storm.apache.org/releases/2.2.0/Understanding-the-parallelism-of-a-Storm-topology.html
  4. Storm 插件和外部集成:https://storm.apache.org/releases/2.2.0/External-Integrations.html
  5. Storm API 文档:https://storm.apache.org/releases/2.2.0/javadocs/index.html
  6. Storm 教程和示例:https://storm.apache.org/releases/2.2.0/Tutorials.html
  7. Storm 与其他大数据工具的集成指南:https://storm.apache.org/releases/2.2.0/Third-party-integrations.html
    在这里插入图片描述

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

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

相关文章

印度转向第一人口大国的背后,是红利还是负担?

KlipC报道&#xff1a;印度正在成为全球第一人口大国&#xff0c;人们对于该事件的关注也持续不断。 KlipC的合伙人Andi Duan表示&#xff1a;“自1881年以来&#xff0c;印度人口就一直增长&#xff0c;据联合国人口统计的数据显示”&#xff0c;今年4月印度人口已经成为全球最…

ElasticSearch_学习笔记

一、初始elasticsearch 什么是elasticsearch&#xff1f; 一个开源的分布式搜索引擎&#xff0c;可以用来时限搜素、日志统计、分析、系统监控等功能。什么是elasitc stack&#xff08;ELK&#xff09;&#xff1f; 是以elasticsearch为核心的技术栈&#xff0c;包括 beats、L…

C#——多线程之Thread

C#——多线程之Thread 前言一、Thread是什么&#xff1f;二、各应用场景以及实例分析1.前台线程和后台线程&#xff1a;2.异步处理3.线程状态及手动销毁线程4.线程同步/等待线程完成 总结 前言 上次简单讲述了关于多线程中Task的相关应用以及场景。今天我们来看一下多线程中Th…

这就是ChatGPT,走进我们的生活!

这就是ChatGPT&#xff0c;走进我们的生活&#xff01; 早在年初&#xff0c;合作导师将我叫过去&#xff0c;让我了解学习一下ChatGPT&#xff0c;看能不能对我们的生活有所帮助。一直使用着国内镜像&#xff0c;五月份我才注册了OpenAI的账户。如今&#xff0c;打开购物商城购…

安全测试国家标准解读——并发程序安全

本系列文章主要围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》进行讲解&#xff0c;该标准是2020年4月28日&#xff0c;由国家市场监督管理总局、国家标准化管理委员会发布&#xff0c;2020年11月01日开始实施。我们对该标准中一些常见的漏洞进行了梳理&#xff…

leetcode 134. 加油站

2023.7.31 这题直观思路是暴力法&#xff0c;用一个for循环遍历所有起点&#xff0c;判断哪个起点能走回来。 不过最后有几个很阴间的示例通过不了&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {f…

SpringBoot使用MyBatis Plus + 自动更新数据表

1、Mybatis Plus介绍 Mybatis&#xff0c;用过的都知道&#xff0c;这里不介绍&#xff0c;mybatis plus只是在mybatis原来的基础上做了些改进&#xff0c;增强了些功能&#xff0c;增强的功能主要为增加更多常用接口方法调用&#xff0c;减少xml内sql语句编写&#xff0c;也可…

编写Java代码制造一个内存溢出的情况

编写Java代码制造一个内存溢出的情况 这将会是一篇比较邪恶的文章&#xff0c;当你想在某个人的生活中制造悲剧时你可能会去google搜索它。在java的世界里&#xff0c;内存溢出仅仅只是你在这种情况下可能会引入的一种bug。你的受害者会在办公室里度过几天甚至是几周的不眠之夜…

IO流(3)—转换流与打印流

目录 1. 为什么要用到转换流&#xff1f; 2. 字符输入转换流&#xff08;重点掌握&#xff09; 3. 字符转换输出流&#xff08;理解即可&#xff09; 4. 认识打印流 5. 打印流的作用 6. PrintStream如何使用&#xff1f; 7. PrintStream 内部没有缓冲区 8. PrintWriter…

四、Spring源码-DI的过程

Spring源码-DI的过程 接下来我们分析下Spring源码中Bean初始化过程中的DI过程。也就是属性的依赖注入。 一、构造参数依赖 1. 如何确定构造方法 在Spring中生成Bean实例的时候默认是调用对应的无参构造方法来处理。 Component public class BeanK {private BeanE beanE;priv…

LUN映射出错导致写操作不互斥的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 某公司的光纤SAN存储系统&#xff0c;6块硬盘组建一组RAID6&#xff0c;划分若干LUN&#xff0c;MAP到不同的SOLARIS操作系统服务器上。 服务器故障&分析&#xff1a; 由于业务增长需要新增应用&#xff0c;工作人员增加了一台IBM服务器&am…

共享麻将室开启无人值守新潮流

共享麻将室是指一种基于共享经济模式&#xff0c;将麻将室资源进行共享的服务&#xff0c;为用户提供舒适、方便的娱乐场所。通过共享麻将室&#xff0c;用户可以按需预约和使用麻将室&#xff0c;享受社交娱乐的同时&#xff0c;减少了个人投资和管理麻将室的成本。 相比传统麻…

kotlin 编写一个简单的天气预报app(二)增加搜索城市功能

增加界面显示openweathermap返回的信息。 在activity_main.xml里增加输入框来输入城市&#xff0c;在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 1. 增加输入城市名字的EditText <EditTextandroid:id"id/editTextCity"…

puppeteer代理的搭建和配置

puppeteer代理的搭建和配置 本文深入探讨了Puppeteer在网络爬虫和自动化测试中的重要角色&#xff0c;着重介绍了如何搭建和配置代理服务器&#xff0c;以优化Puppeteer的功能和性能。文章首先介绍了Puppeteer作为一个强大的Headless浏览器自动化工具的优势和应用场景&#xf…

【嵌入式学习笔记】嵌入式入门1——GPIO

1.什么是GPIO General Purpose Input Output&#xff0c;即通用输入输出端口&#xff0c;简称GPIO&#xff0c;作用是负责采集外部器件的信息或者控制外部器件工作&#xff0c;即输入输出。 2.STM32 GPIO简介 2.1.GPIO特点 不同型号&#xff0c;IO口数量可能不一样&#x…

企业如何在线编写一份优秀的产品说明文档?

编写一份优秀的产品说明文档对于企业来说非常重要&#xff0c;它可以帮助用户理解产品的功能、使用方法和优势&#xff0c;提高用户体验和满意度。下面是一些关键的步骤和建议&#xff0c;帮助企业在线编写一份优秀的产品说明文档。 一、明确目标受众 在编写产品说明文档之前…

搞活系列-Java NIO之偏偏不用buffer.flip()会出现什么问题?

最近看博客又看到了Java NIO相关的博客&#xff0c;其中有讲解NIO和传统IO关于文件复制的文章&#xff0c;看到了如下的代码&#xff1a; /**** channel用例* 基于channel的文件复制*/Testpublic void fileCopyByChannel(){try {FileInputStream fileInputStream new FileInpu…

MyBatis小记_one

目录 什么是框架 1.框架的概述 2.框架要解决的问题 3. 软件开发的分层重要性 4.分层开发的常见框架 MyBatis 框架概述 JDBC 编程的回顾 JDBC 问题分析 MyBatis 框架快速入门 1.官网下载MyBatis框架jar包 2.搭建MyBatis 开发环境 3. 编写持久层接口的映射文件 IUserD…

Stable Diffusion 使用教程

环境说明&#xff1a; stable diffusion version: v1.5.1python: 3.10.6torch: 2.0.1cu118xformers: N/Agradio: 3.32.0 1. 下载 webui 下载地址&#xff1a; GitHub stable-diffusion-webui 下载 根据自己的情况去下载&#xff1a; 最好是 N 卡&#xff1a;&#xff08;我的…

计数排序算法

计数排序 计数排序说明&#xff1a; 计数排序&#xff08;Counting Sort&#xff09;是一种非比较性的排序算法&#xff0c;它通过统计元素出现的次数&#xff0c;然后根据元素出现的次数将元素排列在正确的位置上&#xff0c;从而实现排序。计数排序适用于非负整数或者具有确…