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

Spark 中 RDD 的诞生:原理、操作与分区规则

Spark 的介绍与搭建:从理论到实践-CSDN博客

Spark 的Standalone集群环境安装与测试-CSDN博客

PySpark 本地开发环境搭建与实践-CSDN博客

Spark 程序开发与提交:本地与集群模式全解析-CSDN博客

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践-CSDN博客

目录

一、RDD 的诞生

(一)数据处理的需求与挑战

(二)RDD 的应运而生

二、RDD 的设计及定义

(一)解决的问题

(二)定义解读

三、理解 WordCount 中的 RDD 设计

(一)WordCount 示例与 RDD 的关系

(二)RDD 在 WordCount 中的优势体现

四、RDD 的五大特性

(一)每个RDD都由一系列的分区构成

(二)RDD的转换操作本质上是对RDD所有分区的并行转换

(三)每个RDD都会保存与其他RDD之间的依赖关系:血链机制或者血脉机制

(四)可选的,如果是二元组【KV】类型的RDD,在Shuffle过程中可以自定义分区器。

(五)可选的,Spark程序运行时,Task的分配可以指定实现本地优先计算:最优计算位置.

总结

五、RDD 的创建的两种方式

(一)方式一:并行化一个已存在的集合

parallelize 方法介绍

分区的意义和作用

(二)方式二:读取外部共享存储系统

textFile、wholeTextFile、newAPIHadoopRDD 等方法

与外部存储系统的交互优势

六、RDD 分区的设定规则

(一)分区数的决定因素

(二)分区的优化策略

七、总结


        在大数据处理领域,Spark 已经成为了一个极具影响力的框架。而 RDD(Resilient Distributed Dataset)作为 Spark 的核心数据结构,是理解和高效使用 Spark 的关键。本文将深入探讨 RDD 的相关知识,包括它的诞生背景、设计与定义、在 WordCount 中的应用、五大特性、创建方式以及分区的设定规则等内容,希望能帮助读者更好地掌握 Spark 中 RDD 的使用。

一、RDD 的诞生

(一)数据处理的需求与挑战

        当我们处理大规模数据时,传统的数据结构如列表(list)存在很大的局限性。例如,在读取数据的场景中,我们可能会有如下代码:

# step1:读取数据
input = sc.textFile("输入路径")

        这里的input需要一种特殊的数据类型来表示。它既要像集合一样能容纳数据,又要能够处理数据分布在不同服务器上的情况。如果使用list,由于list数据只能存储在一台服务器的内存中,无法利用多台服务器的内存来存储大规模分布式数据,所以无法满足需求。

(二)RDD 的应运而生

        为了上述这个问题,RDD(弹性分布式数据集)诞生了。它是一种全新的数据类型,能够很好地满足既能表示集合,又能体现分布式存储和处理的要求。例如在后续的数据处理和保存过程中:

# step2:处理数据
result = input.具体的处理逻辑【map、flatMap、filter、reduceByKey等】 
# step3:保存结果 
result.saveAsTextFile("输出路径")

        这里的result也是分布在不同服务器上的数据,RDD 为这种分布式数据的处理和存储提供了合适的解决方案。

二、RDD 的设计及定义

(一)解决的问题

        RDD 解决了在分布式环境下处理大规模数据的难题。它的全称 Resilient Distributed Dataset,从这个英文名称可以看出它的几个关键特性。

弹性 分布式 数据集

(二)定义解读

  1. 弹性(Resilient)
    RDD 具有弹性,这意味着它能够在部分数据丢失或节点故障的情况下自动恢复。例如,在集群中某个节点出现故障时,Spark 可以根据 RDD 的依赖关系重新计算丢失的数据,保证数据处理的连续性和正确性。
  2. 分布式(Distributed)
    数据分布在集群中的多个节点上。这使得 RDD 可以利用多台服务器的资源来存储和处理数据,大大提高了数据处理的规模和效率。与传统的单机数据结构相比,分布式的特性使得 RDD 能够处理海量的数据。
  3. 数据集(Dataset)
    它本质上是一个数据集,可以包含各种类型的数据,如文本数据、数值数据等。用户可以对这个数据集进行各种操作,如转换、过滤、聚合等操作。

弹性分布式数据集,获取RDD有两种方式
1) 将一个现有的集合,丢进去,变为一个分布式的RDD
2)  读取外部数据,变为RDD

三、理解 WordCount 中的 RDD 设计

(一)WordCount 示例与 RDD 的关系

        WordCount 是大数据处理中的一个经典案例。在 WordCount 程序中,RDD 的设计起着至关重要的作用。通过将文本数据转换为 RDD,我们可以利用 RDD 的分布式特性和丰富的操作方法来高效地统计单词的出现次数。
        例如,首先将输入的文本文件读取为 RDD,然后通过一系列的转换操作(如flatMap将每行文本拆分成单词、map操作将单词转换为(单词, 1)的键值对形式、reduceByKey对相同单词的计数进行累加)来实现 WordCount 的功能。整个过程充分利用了 RDD 的分布式计算能力,使得 WordCount 可以在大规模文本数据上快速运行。

input_rdd:读取到的数据的RDD
filter_rdd:经过filter处理以后的数据的RDD
flatMap_rdd:经过flatMap处理以后的数据的RDD
map_rdd:经过map处理以后的数据的RDD
rs_rdd:经过reduceByKey处理以后的结果的RDD

(二)RDD 在 WordCount 中的优势体现

        在 WordCount 中使用 RDD 的优势在于它能够并行处理数据。由于数据分布在不同的服务器上,多个节点可以同时对数据进行处理,大大缩短了处理时间。而且 RDD 的容错机制保证了在处理过程中即使出现节点故障等问题,也能正确地完成 WordCount 任务。

四、RDD 的五大特性

(一)每个RDD都由一系列的分区构成

RDD是逻辑,每个RDD在物理上都可以对应着多个分区的数据,每个分区的数据可以存储在不同的节点上

rdd1
||
part0: 1 2 3 4 -> bigdata01
part1: 5 6 7 8 -> bigdata02

(二)RDD的转换操作本质上是对RDD所有分区的并行转换

转换数据:rdd2 = rdd1.map(lambda x: x*2)
rdd1
||
part0: 1 2 3 4 -> bigdata01 -> Task0 -> x * 2 -> part0: 2 4 6 8
part1: 5 6 7 8 -> bigdata02 -> Task1 -> x * 2 -> part1: 10 12 14 16
||
rdd2

(三)每个RDD都会保存与其他RDD之间的依赖关系:血链机制或者血脉机制

第一个问题:软件在设计时是怎么保证数据的安全性?
方案一:副本机制:将数据存储多份,每一份存在不同的节点上【内存一般不建议使用副本,内存小,而且易丢失】   hdfs
方案二:操作日志:记录内存的所有变化追加到一个日志文件中,可以通过日志文件进行恢复【日志数据量太大,恢复部分数据性能特别差】  namenode、redis
方案三:依赖关系:记录所有数据的来源,当数据丢失的时候,基于数据来源重新构建一份  spark

第二个问题:RDD的数据都是放在内存中,如果计算过程中RDD的数据在内存中丢失了,怎么解决,能够恢复内存中的数据?

RDD的算子实行Lazy模式,就是不到最后一个行为算子,整个算子的链条不执行。
在整个所有RDD构建过程中,Driver会记录每个RDD的来源【与其他RDD之间的关系:血脉】
其中任何一个RDD的数据如果丢失,都可以通过血脉重新构建这个RDD的数据
例如:如果rdd5在打印过程中内存中丢了一个分区的数据,会根据rdd5的血脉来恢复rdd5的数据

第三个问题:血脉机制保证了RDD的安全性,RDD第一次构建或者RDD数据丢失,都会通过血脉构建RDD的数据,但是如果一个RDD被使用多次,这个RDD也会通过血脉构建多次,会影响程序的性能,怎么解决这个问题? checkpoint 等机制

(四)可选的,如果是二元组【KV】类型的RDD,在Shuffle过程中可以自定义分区器。

假如不是二元组的数据类型,自然就不会有什么shuffle了。

在MR程序中,有一个自定义分区器。
Spark中自带了两种分区器
HashPartition:根据Key的Hash值取模分区个数来决定进入哪个分区,大部分默认使用的
RangePartition:范围分区器,一般很少用到
分区规则选择
HashPartition:优点-只要Key相同,一定会进入同一个分区,缺点-容易导致数据倾斜
RangePartition随机分区:优点-随机的,相对均衡,不会倾斜,缺点-相同的Key不一定在同一个分区。

(五)可选的,Spark程序运行时,Task的分配可以指定实现本地优先计算:最优计算位置.

使用最优路径方案:如果说Task就在数据所在的机器运行,效率是最高的

Spark 是怎么做到这一点的,或者说如何做到这一点?

PROCESS_LOCAL:Task直接运行在数据所在的Executor中
NODE_LOCAL:Task分配在与数据同机器的其他Executor中
RACK_LOCAL:Task分配在于数据同机架的不同机器的Executor中
NO_PREF:不做最优配置

总结

RDD的五大特性分别是什么?
a. 每个RDD都可以由多个分区构成
b. 对RDD转换处理本质上是对RDD所有分区的并行转换处理
c. 对每个RDD都会保留与其他RDD之间的依赖关系:血脉机制
d. 可选的,对于KV结构的RDD,在经过Shuffle时,可以干预分区规则,默认是Hash分区
e. 可选的,Spark分配Task时会优先本地计算,尽量将Task分配到数据所在的节点

五、RDD 的创建的两种方式

(一)方式一:并行化一个已存在的集合

parallelize 方法介绍

        在 Python 中,可以使用parallelize方法将一个已存在的集合转换为 RDD。例如:

# 方式一:将一个已存在的集合转换为RDD
# 创建一个列表:会在Driver内存中构建
data = [1,2,3,4,5,6,7,8,9,10]
# 将列表转换为RDD:将在多个Executor内存中实现分布式存储, numSlices用于指定分区数,所谓的分区就是分为几份,每一份放在一台电脑上
list_rdd = sc.parallelize(data,numSlices=2)
# 打印这个RDD的内容
list_rdd.foreach(lambda x: print(x))

        这里的parallelize方法将本地的data列表转换为了分布式的 RDD。numSlices参数决定了分区的数量,合理设置分区数可以根据集群的资源情况优化数据处理效率。
 

分区的意义和作用

        分区使得数据可以在多个 Executor 上并行处理。每个分区可以被看作是一个独立的数据子集,不同的分区可以在不同的节点上同时进行计算。这样可以充分利用集群的计算资源,提高数据处理速度。

(二)方式二:读取外部共享存储系统

textFile、wholeTextFile、newAPIHadoopRDD 等方法

        通过textFilewholeTextFilenewAPIHadoopRDD等方法可以读取外部存储系统的数据并转换为 RDD。例如:

# 方式二:读取外部系统
# 读取文件的数据变成RDD,minPartitions用于指定最小分区数
file_rdd =sc.textFile("../datas/function_data/filter.txt", minPartitions=2)
# 输出文件的内容
file_rdd.foreach(lambda line: print(line))

        这种方式可以直接从外部存储(如 HDFS、本地文件系统等)读取数据,并将其转换为 RDD。minPartitions参数指定了最小分区数,Spark 会根据数据大小和这个参数来确定实际的分区情况。


与外部存储系统的交互优势

        通过读取外部存储系统,Spark 可以处理存储在不同位置的大规模数据。这种方式使得 Spark 能够与现有的数据存储架构很好地集成,方便地处理各种来源的数据,如日志文件、数据库备份等。

六、RDD 分区的设定规则

(一)分区数的决定因素

  1. 读取数据时的参数设置
    当读取数据创建 RDD 时,如file_rdd =sc.textFile(name="../datas/wordcount/word.txt",minPartitions=2)minPartitions参数会影响分区数。Spark 会根据这个参数和数据的大小、特性等来确定分区的数量。如果数据量较大,适当增加minPartitions的值可以提高并行度,加快数据处理速度。
  2. 其他影响因素
    除了参数设置外,数据的分布情况、集群的资源(如节点数量、内存大小等)也会对分区数产生影响。例如,如果集群中有更多的节点和内存资源,可以增加分区数以充分利用这些资源。同时,如果数据在存储系统中本身有一定的分区结构,Spark 也可能会参考这种结构来确定 RDD 的分区。

(二)分区的优化策略

  1. 根据数据量调整分区数
    对于大规模数据,增加分区数可以提高并行处理能力。但分区数也不是越多越好,过多的分区可能会导致任务调度开销增加。需要根据数据量和集群资源找到一个合适的平衡点。例如,可以通过一些实验和性能测试来确定最佳的分区数。
  2. 考虑数据本地性和计算资源平衡
    在设置分区数时,要考虑数据本地性。尽量保证每个分区的数据在处理时能够在本地节点或者附近节点上进行计算,减少数据传输。同时,也要平衡各个节点的计算资源分配,避免某些节点负载过重而其他节点闲置的情况。

七、总结

        本文详细介绍了 Spark 中 RDD 的诞生背景、设计定义、在 WordCount 中的应用、五大特性、创建方式以及分区设定规则等内容。RDD 作为 Spark 的核心数据结构,为分布式数据处理提供了强大的支持。通过合理地创建和使用 RDD,利用其特性和分区规则,可以在 Spark 平台上高效地处理大规模数据。在实际应用中,需要根据数据的特点和集群的资源情况来优化 RDD 的使用,以充分发挥 Spark 的优势,实现高效、可靠的数据处理任务。无论是处理文本数据、数值数据还是其他类型的大规模数据,深入理解 RDD 都是掌握 Spark 数据处理能力的关键所在。希望本文能为读者在学习和使用 Spark 中的 RDD 时提供有益的指导和帮助,让读者能够在大数据处理领域中更好地运用 Spark 框架来解决实际问题。

相关文章:

Spark 中 RDD 的诞生:原理、操作与分区规则

Spark 的介绍与搭建:从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式之Yarn模式的原…...

c++构造与析构

构造函数特性 名称与类名相同:构造函数的名称必须与类名完全相同,并且不能有返回值类型(包括void)。 自动调用:构造函数在对象实例化时自动调用,不需要手动调用。 初始化成员变量:构造函数的主…...

C++(函数重载,引用,nullptr)

1.函数重载 C⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。传参时会自动匹配传入的参数,对应该函数的形参类型,进行函数调用,这样C函数调⽤就表现出了多态⾏为&a…...

django+postgresql

PostgreSQL概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统(RDBMS),以其高度的稳定性、扩展性和社区支持而闻名。PostgreSQL 支持 SQL 标准并具有很多先进特性,如 ACID 合规、复杂查询、外键支持、事务处理、表分区、JS…...

前端滚动锚点(点击后页面滚动到指定位置)

三个常用方案:1.scrollintoView 把调用该方法的元素滚动到屏幕的指定位置,中间,底部,或者顶部 优点:方便,只需要获取元素然后调用 缺点:不好精确控制,只能让元素指定滚动到中间&…...

使用SSL加密465端口发送邮件

基于安全考虑,云虚拟主机的25端口默认封闭,如果您有发送邮件的需求,建议使用SSL加密端口(465端口)来对外发送邮件。本文通过提供.NET、PHP和ASP样例来介绍使用SSL加密端口发送邮件的方法,其他语言的实现思路…...

一些面试题总结(一)

1、string为什么是不可变的,有什么好处 原因: 1、因为String类下的value数组是用final修饰的,final保证了value一旦被初始化,就不可改变其引用。 2、此外,value数组的访问权限为 private,同时没有提供方…...

泄露的文档显示 Google 似乎意识到了 Tensor 处理器存在过热问题

Google 知道其 Tensor 芯片存在一些问题,尤其是在过热和电池寿命方面,显然他们正在努力通过即将推出的代号为"Malibu"的 Tensor G6 来解决这一问题。 Android Authority 泄露的幻灯片显示,过热是基于 Tensor 的 Pixel 手机退换货的…...

python爬虫案例——网页源码被加密,解密方法全过程

文章目录 1、任务目标2、网页分析3、代码编写1、任务目标 目标网站:https://jzsc.mohurd.gov.cn/data/company,该网站的网页源码被加密了,用于本文测验 要求:解密该网站的网页源码,请求网站并返回解密后的明文数据,网页内容如下: 2、网页分析 进入网站,打开开发者模式,…...

2.4_SSRF服务端请求伪造

SSRF服务端请求伪造 定义:服务端请求伪造。是一种攻击者构造请求后,交由服务端发起请求的漏洞; 产生原理:该服务器提供了从其他服务器获取数据的功能,但没有对用户提交的数据做严格校验; 利用条件&#…...

数据分析反馈:提升决策质量的关键指南

内容概要 在当今快节奏的商业环境中,数据分析与反馈已成为提升决策质量的重要工具。数据分析不仅能为企业提供全面的市场洞察,还能帮助管理层深入了解客户需求与行为模式。掌握数据收集的有效策略和工具,企业能够确保获得准确且相关的信息&a…...

一步步安装deeponet的详细教学

1.deepoent官网如下&#xff1a; https://github.com/lululxvi/deeponet 需要下载依赖 1.python3 2.DeepXDE&#xff08;这里安装DeepXDE<0.11.2,这个最方便&#xff09; Optional: For CNN, install Matlab and TensorFlow 1; for Seq2Seq, install PyTorch&#xff0…...

Devops业务价值流:版本发布最佳实践

敏捷开发中&#xff0c;版本由多个迭代构建而成&#xff0c;每个迭代都是产品进步的一环。当版本最后一个迭代完成时&#xff0c;便启动了至关重要的上线流程。版本发布流程与规划流程相辅相成&#xff0c;确保每个迭代在版本中有效循环执行&#xff0c;最终达成产品目标。 本…...

背包问题(三)

文章目录 一、二维费用的背包问题二、潜水员三、机器分配四、开心的金明五、有依赖的背包问题 一、二维费用的背包问题 题目链接 #include<iostream> #include<algorithm> using namespace std; const int M 110; int n,m,kg; int f[M][M];int main() {cin >…...

linux之调度管理(2)-调度器 如何触发运行

一、调度器是如何在程序稳定运行的情况下进行进程调度的 1.1 系统定时器 因为我们主要讲解的是调度器&#xff0c;而会涉及到一些系统定时器的知识&#xff0c;这里我们简单讲解一下内核中定时器是如何组织&#xff0c;又是如何通过通过定时器实现了调度器的间隔调度。首先我们…...

深入理解 Vue 3 中的 Props

深入理解 Vue 3 中的 Props Vue 3 引入了 Composition API 等新特性&#xff0c;组件的定义和使用也变得更为灵活。而在组件通信中&#xff0c;Props&#xff08;属性&#xff09;扮演了重要角色&#xff0c;帮助父组件向子组件传递数据&#xff0c;形成单向的数据流动&#x…...

校园周边美食探索及分享平台

摘要&#xff1a; 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的美食业进而也面临着巨大的挑战&#xff0…...

内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取

知识点&#xff1a; 1、信息收集篇-网络架构-出网&角色&服务&成员 2、信息收集篇-安全防护-杀毒&防火墙&流量监控 3、信息收集篇-密码凭据-系统&工具&网站&网络域渗透的信息收集&#xff1a; 在攻防演练中&#xff0c;当完成边界突破后进入内…...

石墨舟氮气柜:半导体制造中的关键保护设备

石墨舟是由高纯度石墨材料制成的&#xff0c;主要用于承载硅片或其他基板材料通过高温处理过程&#xff0c;是制造半导体器件和太阳能电池片的关键设备之一。 石墨舟在空气中容易与氧气发生反应&#xff0c;尤其是在高温处理后&#xff0c;表面可能更为敏感&#xff1b;石墨舟具…...

性能调优专题(7)之Innodb底层原理与Mysql日志机制深入剖析

一、MYSQL的内部组件结构 大体来说,Mysql可以分为Server层和存储引擎层两部分。 1.1 Server层 Server层主要包括连接器、查询缓存、词法分析器、优化器等。涵盖MYSQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...