【PySpark大数据分析概述】02 Spark大数据技术框架
【作者主页】Francek Chen
【专栏介绍】 ⌈ ⌈ ⌈PySpark大数据分析与应用 ⌋ ⌋ ⌋ PySpark作为Apache Spark的Python API,融合Python易用性与Spark分布式计算能力,专为大规模数据处理设计。支持批处理、流计算、机器学习 (MLlib) 和图计算 (GraphX),通过内存计算与弹性数据集 (RDD) 优化性能,提供DataFrame API和SQL接口简化结构化数据处理。可跨Hadoop/云平台部署,适用于ETL、日志分析、实时推荐等场景,具备TB级数据横向扩展能力,并与Pandas等Python工具无缝集成,兼顾高效分析与易用性。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
文章目录
- 一、Spark简介
- 二、Spark特点
- 三、Spark运行架构与流程
- (一)Spark运行架构
- (二)Spark运行流程
- 四、Spark RDD
- (一)RDD的产生背景
- (二)RDD的概念与特点
- (三)RDD基本操作
- (四)RDD血缘关系
- (五)RDD之间的依赖关系
- (六)DAG阶段划分
- (七)持久化
- 五、Spark生态圈
- 小结
一、Spark简介
Spark是一个开源的、通用的并行计算框架,支持分布式数据处理。其最大的特点是基于内存进行计算,这样可以显著提高处理速度,尤其是对于那些需要多次访问同一数据集的迭代算法。 Spark与Hadoop生态系统兼容,它可以运行在Hadoop的YARN资源管理器上,并且可以使用HDFS作为其文件系统。Spark由多个组件组成,包括Spark Core、 Spark SQL、Spark Streaming、MLlib(机器学习库)和GraphX(图计算库)。这些组件使得Spark能够一站式解决多种业务和应用需求,如批处理、结构化数据查询、流式计算、机器学习和图计算等。Spark的设计理念是灵活性和易用性,使其适用于多种应用场景,特别是那些需要对特定数据集进行多次操作或迭代计算的场景。
Spark作为新一代大数据处理引擎,其设计理念基于内存存储式计算和高效的容错机制,以便于交互式查询和迭代计算。自推出以来,Spark就迅速成为社区的热门项目。Spark的重要里程碑如图1所示。
2009年,由加利福尼亚大学伯克利分校AMPLab开发的研究性项目。
2010年,通过BSD许可协议正式对外开源发布。
2012年,第一篇关于Spark的论文发布,第一个正式版本Spark 0.6.0发布。
2013年,成为Apache软件基金会项目,发布了Spark Streaming、Spark MLlib、Shark(Spark on Hadoop)。
2014年,成为Apache的顶级项目,5月底Spark 1.0.0发布,同时Spark Graphx和Spark SQL取代了Shark。
2015年,推出了适用于大数据分析的DataFrame编程模型,开始受到IT行业的广泛关注。
2016年,推出了更强的数据分析工具DataSet。
2017年,Structured Streaming发布。
2018年,Spark 2.4.0发布,成为全球最大的开源项目。
2020年,Spark 3.0发布,性能相比Spark 2.4提升了2倍,提供结构化流的新用户界面(User Interface,UI),对Python支持更加友好,并且兼容ANSI SQL。
二、Spark特点
尽管Hadoop已经成为大数据技术的事实标准,并且MapReduce适用于对大规模数据集进行批处理操作,但Hadoop并不适用于实时数据处理。根据MapReduce的工作流程, 它存在表达能力有限、磁盘I/O开销大和延迟高的缺点。相比之下,Spark基于内存进行计算,其计算性能得到了极大的提升。Spark主要有以下4个特点。
- 通用性:一栈式解决方案,可以用于批处理、交互式查询、实时流处理、机器学习和图计算等多种不同类型的处理。对企业应用来说,可以使用一个平台来进行不同的工程实现,从而减少人力开发和平台部署成本。
- 兼容性:Spark能够与很多开源框架兼容使用。Spark可以使用Hadoop YARN和Apache Mesos作为其资源管理和调度器。可以从多种数据源读取数据,如HDFS、HBase、MySQL等。
- 高效性:Spark采用内存存储中间计算结果,减少迭代运算的磁盘I/O。通过并行计算有向无环图(DAG)的优化,减少不同任务之间的依赖,降低延迟等待时间。在内存中,Spark的运行速度比MapReduce快100倍。
- 易用性:与MapReduce仅支持Map和Reduce两种编程类型不同,Spark提供超过80种不同的转换和行动算子。采用函数式编程风格,使相同功能需要的代码量大大缩小。
三、Spark运行架构与流程
Spark运行架构指Spark Core架构。Spark Core是Spark的核心,其功能包含内存计算、任务调度、模式部署、存储管理、故障恢复等。
(一)Spark运行架构
Spark运行架构包括四个主要组件:集群管理器(Cluster Manager)、应用的任务驱动器(Driver)、工作节点(Worker Node)以及执行进程(Executor)。这四个组件共同构成了Spark的运行环境。如图2所示。
- Driver:任务驱动器,负责启动运行main()方法并创建SparkContext对象。
- Cluster Manager:集群管理器,在集群上获取资源的外部服务,支持Standalone、Mesos和YARN这3种类型。
- Worker Node:工作节点,集群中运行Application代码的任意一个节点。
- Executor:运行在工作节点中的进程,负责运行Task,并为应用程序存储数据,在这个过程中,可能会将数据写入内存或磁盘进行缓存(Cache)。
(二)Spark运行流程
Spark运行基本流程如图3所示。
- 步骤1:Driver创建一个SparkContext对象来构建Spark Application的运行环境,SparkContext向集群管理器(Cluster Manager)注册并申请运行Executor资源。
- 步骤2:Cluster Manager为Executor分配资源并启动Executor进程。
- 步骤3:SparkContext根据RDD依赖关系构建有向无环图(DAG),然后DAG Scheduler将DAG分解成多个Stage,并将每个Stage的TaskSet(任务集,即多组任务)发送给Task Scheduler(任务调度器)。Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor。
- 步骤4:Task在Executor上运行,将执行结果反馈给Task Scheduler,再反馈给DAG Scheduler。运行完毕后,数据被写入存储系统,并向集群管理器注销Task,释放所有Task Scheduler资源。
关于DAG Scheduler与Task Scheduler的作用如下。
DAG Scheduler决定运行Task的理想位置,并将这些信息传递给下层的Task Scheduler。DAG Scheduler还会将DAG分解成多个Stage,然后将Stage以TaskSet的形式提交给Task Scheduler。此外,DAG Scheduler还处理可能在Shuffle阶段因数据丢失所导致的失败,这有可能需要重新提交运行之前的Stage。
Task Scheduler维护所有TaskSet,当Executor向Driver发送“心跳”信息时,Task Scheduler会根据其资源剩余情况分配相应的Task。另外,Task Scheduler还维护着所有Task的运行状态,重试失败的Task。
四、Spark RDD
RDD是Spark的核心数据结构,代表弹性分布式数据集(Resilient Distributed Datasets)。它提供了一种高度抽象化的接口,使得开发者可以方便地处理大规模数据集。
(一)RDD的产生背景
RDD的设计理念源自于AMP Lab发表的论文“Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing”。为了解决迭代式算法和交互式数据挖掘工具中,不同计算阶段之间会重用中间结果的问题,Spark设计了RDD。通过将具体的应用逻辑表达为一系列RDD的转换处理,不同RDD之间的转换操作形成依赖关系,可以实现管道化。这样可以避免对中间结果的存储,从而大大降低数据复制、磁盘I/O和序列化开销。
(二)RDD的概念与特点
RDD是分布式对象集合,本质上是一个只读的分区记录集合。每个RDD可以被分成多个分区,这些分区是数据集的片段。不同RDD的分区可以保存在集群中的不同节点上,从而实现在不同节点上的并行计算。RDD的主要特点如下。
- 弹性计算:包括存储弹性、容错弹性、计算弹性和分片弹性。
分布式数据存储计算:RDD数据被分割到不同服务器节点的内存上,以实现分布式计算的目的。 - 延迟计算:RDD转换操作采用惰性机制,只有当执行行动操作时,才会真正开始计算。
- 不可变性:RDD数据采用只读模式,不能直接修改,只能通过相关的转换操作生成新的数据来间接达到修改的目的。
- 可分区:作为分布式计算框架,Spark支持数据的可分区特性,用户可以在任何现有的RDD上执行分区操作。
(三)RDD基本操作
RDD基本操作包括RDD的构建、RDD的转换操作和RDD的行动操作。
1. RDD构建操作
RDD主要有以下3种构建操作。
① 从集合中构建RDD。
② 在现有RDD的基础上构建新的RDD。
③ 从外部数据源(如本地文件、HDFS、数据库等)中读取数据来构建RDD。
2. RDD转换操作
RDD转换操作是指从一个RDD中生成一个新的RDD。需要注意的是,RDD中的所有转换都是延迟加载的,并不会直接计算结果。只有遇到行动算子时,这些转换操作才会真正进行。这种设计让Spark能更加高效地运行。RDD转换操作通过诸如map()、filter()、flatMap()、reduceByKey()等具有不同功能的转换算子实现。如表1所示。
算子 | 解释 |
---|---|
map(func) | 对RDD中的每个元素都使用func,返回一个新的RDD,其中func为用户自定义函数 |
filter(func) | 对RDD中的每个元素都使用func,返回使func为true的元素构成的RDD,其中func为用户自定义函数 |
flatMap(func) | 对RDD中的每个元素进行map操作后,再进行扁平化 |
union(otherDataset) | 合并RDD,需要保证两个RDD的元素类型一致 |
groupByKey(numPartitions) | 按键分组,在键值对(K,V)组成的RDD上调用时,返回(K,Iterable[V])对组成的新RDD。numPartitions用于设置分组后RDD的分区个数,默认分组后的分区个数与分组前的个数相等 |
reduceByKey(func,[numPartitions]) | 聚合具有相同键的值 |
3. RDD行动操作
RDD行动操作用于执行计算并按指定方式输出结果。行动操作接收RDD作为输入,但返回非RDD类型的值或结果。在RDD执行过程中,真正的计算发生在RDD行动操作。RDD行动操作通过如reduce()、count()、take()、countByKey()等各具功能的行动算子实现,如表2所示。
算子 | 解释 |
---|---|
reduce(func) | 通过函数func聚集RDD中的所有元素。函数func接收两个参数,返回一个值 |
collect() | 返回RDD中所有的元素 |
count(n) | 返回RDD中所有元素的个数(此处原表述可能有误,count 通常不接受参数 n ,直接返回 RDD 中元素个数 ) |
first(n) | 返回RDD中的第一个元素(此处原表述可能有误,first 通常不接受参数 n ,直接返回 RDD 中第一个元素 ) |
take(n) | 返回前n个元素 |
countByKey() | 根据键值对(key-value)中的key进行计数,返回一个字典,对应每个key在RDD中出现的次数 |
countByValue() | 根据RDD中数据的数据值进行计数(需要注意的是,计数的数据值不是键值对中的value),同样返回一个字典,对应每个数据出现的次数 |
saveAsTextFile(path) | 将RDD的元素以文本文件的形式保存到指定的路径,path可以是本地文件系统、HDFS或任何其他Hadoop支持的文件系统。Spark将会调用每个元素的toString()方法,并将它转换为文件中的一行文本 |
foreach(func) | 对RDD中的每个元素都执行函数func |
(四)RDD血缘关系
RDD是通过一系列转换操作从父RDD计算得到的。当RDD丢失时,可以通过血缘关系重新计算行动操作触发实际计算。
上例中,系统从输入中逻辑上生成了A和C两个RDD,经过一系列转换操作,逻辑上生成了F这个RDD。
血缘关系的重要性:下一代RDD依赖于上一代RDD,通过血缘关系可以恢复丢失的RDD,保证RDD计算的稳定性和可靠性。
RDD是Spark的核心数据结构,RDD的血缘关系保证了数据的可靠性和容错性,理解RDD的血缘关系有助于更好地使用Spark进行大数据处理。
(五)RDD之间的依赖关系
RDD之间存在依赖关系,用户可以通过已有的RDD转换生成新的RDD。新、旧RDD之间的联系称为依赖关系,分为窄依赖和宽依赖两种。
窄依赖表现为父RDD的一个分区对应子RDD的一个分区,或父RDD的多个分区对应子RDD的一个分区。典型的窄依赖操作包括map()、filter()、union()、join()等。如图5所示。
宽依赖表现为父RDD的一个分区对应子RDD的多个分区。宽依赖典型的操作包括groupByKey()、sortByKey()等。如图6所示。
Spark的依赖关系设计使其具有良好的容错性,并大大提升了执行速度。RDD通过血缘关系记录了它是如何从其他RDD中演变过来的。当某个RDD的部分分区数据丢失时,它可以通过血缘关系获取足够的信息,重新计算和恢复丢失的数据分区。
相对而言,窄依赖的失败恢复更为高效,只需要根据父RDD的分区重新计算丢失的分区即可,而不需要重新计算父RDD的所有分区。而对于宽依赖来说,即使只是单个节点失效导致RDD的一个分区失效,也需要重新计算父RDD的所有分区,开销较大。
宽依赖操作类似于将父RDD中所有分区的记录进行“洗牌”,数据被打散后在子RDD中进行重组。
(六)DAG阶段划分
DAG阶段划分的重要性:确定执行顺序,优化计算效率。
宽依赖会将DAG分为不同的阶段。不同阶段不能并行计算:后面阶段的RDD计算需要等待前面阶段RDD的所有分区全部计算完毕后才能进行。
RDD行动操作与阶段划分:从行动操作开始倒序划分阶段,窄依赖操作划分到同一个执行阶段,宽依赖操作划分到新的执行阶段。
示例:DAG阶段划分的详细过程。如图7所示。
根据读入数据生成RDD A、C和E,经过一系列转换操作得到新的RDD G,只有groupByKey()、join()操作是宽依赖,Spark会以此为边界将其前后划分成不同的阶段。
流水线操作与计算效率:在Stage 2中,map()和union()操作形成流水线操作。通过map()操作生成的分区可以不用等待整个RDD计算结束,而是继续进行union()操作,大大提高了计算的效率。
(七)持久化
RDD的持久化是Spark用于提高计算效率和节省资源的重要机制。RDD是惰性求值的,每次对某个RDD调用行动操作时都会重新计算该RDD及其依赖。如果需要多次使用同一个RDD,那么消耗会非常大。为了避免多次计算同一个RDD,可以对RDD数据进行持久化。
persist()和cache()是用于将任意RDD缓存到内存或磁盘文件系统中的方法。缓存是容错的,如果一个RDD分片丢失,可以通过构建RDD的转换操作自动重构。已缓存的RDD被使用时,存取速度会大大提升。一般情况下,Executor 60%的内存用于缓存RDD数据,剩下的40%用于执行任务。
cache()只能将RDD缓存到内存中,是persist()的特例方法。而persist()可以让用户根据需求指定一个持久化级别。如表3所示。
级别 | 使用空间 | CPU 时间 | 是否在内存 | 是否在磁盘 |
---|---|---|---|---|
MEMORY_ONLY | 高 | 低 | 是 | 否 |
MEMORY_ONLY_SER | 低 | 高 | 是 | 否 |
MEMORY_AND_DISK | 高 | 中 | 部分 | 部分 |
MEMORY_AND_DISK_SER | 低 | 高 | 部分 | 部分 |
DISK_ONLY | 低 | 高 | 否 | 是 |
对于 MEMORY_AND_DISK和MEMORY_AND_DISK_SER级别,系统会首先将数据保存在内存中,如果内存不够,则将溢出部分写入磁盘中。另外,为了提高缓存的容错性,可以在持久化级别名称的后面加上“_2”,将持久化数据存储为两份,如MEMORY_ONLY_2。不同持久化级别的目的是满足内存使用和CPU效率权衡上的不同需求。 将上述三段合并为一段更紧凑一些。
可以通过以下步骤选择合适的持久化级别。
- 如果RDD可以很好地与默认的存储级别(MEMORY_ONLY)契合,那么不需要做任何修改。MEMORY_ONLY是CPU使用效率最高的选项,该存储级别使得RDD的操作尽可能快。
- 如果RDD不能与默认的存储级别较好契合,那么可以尝试使用MEMORY_ONLY_SER,并选择一个快速序列化的库,使得对象在有比较高的空间使用率的情况下,依然可以较快被访问。
- 除非数据集的计算量特别大或需要过滤大量数据,否则应尽量避免将数据存储至硬盘上。重新计算一个分区的速度与从硬盘中读取的速度基本差不多。
- 如果希望拥有较强的故障恢复能力,可以使用复制存储级别(MEMORY_ONLY_2)。所有的存储级别都有通过重新计算丢失数据来恢复错误的容错机制。复制存储级别可以让任务在RDD上持续运行,而不需要等待丢失的分区被重新计算。
在不需要缓存RDD时,应及时使用unpersist()算子来释放缓存的RDD数据。
五、Spark生态圈
Spark的设计遵循“一站式”的理念,即在同一个平台上支持不同的大数据应用场景,包括复杂的批量数据处理、基于历史数据的交互式查询以及基于实时数据的处理等。这使得Spark能够灵活适应各种计算需求,从数据分析到机器学习再到实时数据处理,都能找到其在生态圈中的相应位置。Spark生态圈如图8所示。
Apache Spark生态圈是一个多功能、强大的大数据计算平台。Spark生态圈由加州大学伯克利分校的AMP实验室创建,并以其核心组件Spark Core为中心,构建了一个广泛的大数据和机器学习工具集合。这个生态系统涵盖了多种不同的技术与应用,具体来说,包含以下几个重要组成部分:
1. Spark Core
Spark Core作为Spark引擎的核心,提供基于内存的分布式计算,在Hadoop原生的MapReduce引擎的基础上继承其优势、弥补其不足,减少计算过程当中的迭代运算,大大提升计算效率。Spark Core强大功能体现在其包含Spark基础和核心的功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等,主要面向数据批处理。Spark Core建立在统一的抽象RDD之上,因此能够以基本一致的方式应对不同的大数据处理场景。Spark Core通常简称Spark。
2. Spark SQL
Spark SQL是用于处理结构化数据的组件,允许开发人员直接处理RDD,以及查询存储在Hive、HBase上的外部数据。Spark SQL的一个重要特点是能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行外部查询,并进行更复杂的数据分析。
3. Spark Streaming
Spark Streaming是对实时数据流进行高吞吐量、容错处理的流式处理系统,其核心思想是将数据分解成一系列短小的批处理作业,每个短小的批处理作业都可以使用Spark Core进行快速处理。Spark Streaming可以对多种数据源,如Kafka、Flume和传输控制协议(Transmission Control Protocol,TCP)套接字等进行类似map()、reduce()和join()等操作,并将结果保存到外部文件系统或数据库中,或应用到实时仪表盘上。
4. MLlib
Spark MLlib机器学习库实现一些常见的机器学习算法和实用程序。Spark MLlib降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习相关的工作。
5. GraphX
Spark GraphX是Spark中用于图计算的API,可以认为是GraphLab和Pregel在Spark上的重写及优化。与其他分布式图计算框架相比,Spark GraphX最大的贡献是在Spark之上提供一栈式数据解决方案,可以方便且高效地完成图计算的一整套流水作业。
小结
Spark是一个开源、通用的并行计算框架,支持分布式数据处理,基于内存计算显著提升处理速度,与Hadoop生态系统兼容,由Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX等组件构成,可一站式解决多种业务需求。
Spark具有通用性、兼容性、高效性和易用性等特点。其运行架构包含集群管理器、Driver、Worker Node和Executor四个主要组件。运行流程是Driver创建SparkContext对象,向集群管理器申请资源,集群管理器分配资源并启动Executor进程,SparkContext构建DAG并分解成多个Stage,Task Scheduler将Task发放给Executor执行。
RDD是Spark的核心数据结构,代表弹性分布式数据集,具有弹性计算、延迟计算、不可变性和可分区等特点。RDD基本操作包括构建、转换和行动操作,其中转换操作延迟加载,行动操作触发计算。RDD通过血缘关系保证数据可靠性和容错性,依赖关系分为窄依赖和宽依赖,宽依赖将DAG分为不同阶段。持久化是Spark提高计算效率和节省资源的重要机制,可根据需求选择合适的持久化级别。
Spark生态圈以Spark Core为中心,构建了一个广泛的大数据和机器学习工具集合,包含Spark SQL、Spark Streaming、MLlib和GraphX等重要组成部分,能够灵活适应各种计算需求。
欢迎 点赞👍 | 收藏⭐ | 评论✍ | 关注🤗
相关文章:
【PySpark大数据分析概述】02 Spark大数据技术框架
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PySpark大数据分析与应用 ⌋ ⌋ ⌋ PySpark作为Apache Spark的Python API,融合Python易用性与Spark分布式计算能力,专为大规模数据处理设计。支持批处理、流计算、机器学习 (MLlib) 和图计算 (GraphX)&am…...
JVM 参数调优指南_优化 Java 应用性能
1. 引言 1.1 什么是 JVM 参数调优 JVM 参数调优是指通过调整 Java 虚拟机的各种参数,以优化 Java 应用程序的性能和稳定性。 1.2 JVM 参数调优的重要性 提高性能:优化内存使用和垃圾回收,提升应用程序的响应速度。稳定性:减少内存溢出和垃圾回收暂停时间,提高系统的稳定…...
闭包和装饰器
什么是闭包 闭包(Closure)是 Python 中一个非常重要的概念,它是一种特殊的函数对象,通常用于封装和延迟计算某些值。以下是闭包的详细定义和解释: 1.闭包的定义 闭包是指一个函数对象,它不仅包含函数的代…...
电脑显示器选购
显示器分类 按尺寸大小 一般显示器屏幕有24寸、27寸、32寸等 按技术分类 LCD显示器 使用液晶分子作为主要材料,以液晶为显示/控制模块制造而成的显示设备。液晶显示器中的液晶体在工作时不发光,而是控制外部的光通过量。当外部光线通过液晶分子时&a…...
论伺服电机在轨道式巡检机器人中的优势及应用实践
一、引言 1.1 研究背景与意义 在现代工业生产、电力系统、轨道交通等诸多领域,保障设施设备的安全稳定运行至关重要。轨道式巡检机器人作为一种高效、智能的巡检工具,正逐渐在这些领域崭露头角。它能够沿着预设轨道,对目标区域进行全方位…...
室内指路机器人是否支持与第三方软件对接?
嘿,你知道吗?叁仟室内指路机器人可有个超厉害的技能,那就是能和第三方软件 “手牵手” 哦,接下来就带你一探究竟! 从技术魔法角度看哈:好多室内指路机器人都像拥有超能力的小魔法师,采用开放式…...
Docker 命令大全:从入门到精通
一、容器生命周期管理 1. 容器操作基础 # 运行容器 docker run -d --name my_nginx -p 8080:80 nginx:latest# 启动/停止容器 docker start my_nginx docker stop my_nginx# 重启容器 docker restart my_nginx# 删除容器 docker rm my_nginx 2. 容器状态管理 # 查看运行中的…...
【HarmonyOS Next之旅】DevEco Studio使用指南(十一)
目录 1 -> 代码实时检查 2 -> 代码快速修复 3 -> C快速修复使用演示 3.1 -> 填充switch语句 3.2 -> 使用auto替换类型 3.3 -> 用?:三元操作符替换if-else 3.4 -> 从使用处生成构造函数 3.5 -> 将变量拆分为声明和赋值 1…...
【中间件】使用ElasticSearch提供的RestClientAPI操作ES
一、简介 ElasticSearch提供了RestClient来操作ES,包括对数据的增删改查,可参照官方文档:Java High Level REST Client 二、使用步骤: 可参照官方文档操作 导包 <dependency><groupId>org.elasticsearch.client<…...
数字电子技术基础(三十九)——显示译码器
目录 1 显示译码器 1.1 显示译码器简介 1.2 七段显示译码器和八段显示译码器 1.3 BCD-七段显示译码器 1.4 多位显示译码器 1 显示译码器 1.1 显示译码器简介 显示译码器是一种数字电路,是将二进制转换为驱动显示设备所需要的信号,核心是将编码数据…...
Java学习总结-多线程-三种创建方法
什么是线程? 线程(Thread)是程序内部的一条执行流程。 程序如果只有一条执行流程,那这个程序就是单线程程序。 什么是多线程? 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行…...
sqli-labs靶场 less 7
文章目录 sqli-labs靶场less 7 mysql文件上传拿web shell sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、…...
大模型最新面试题系列:模型部署(二)
一、如何通过unsloth的批处理(Batching)功能提升推理效率? Unsloth的批处理(Batching)功能通过整合硬件加速、内存优化和动态调度技术,显著提升大模型推理效率。以下是具体实现方法和实际应用场景的深度解…...
Python助力去中心化云计算:构建分布式计算的未来
Python助力去中心化云计算:构建分布式计算的未来 随着区块链技术和Web 3.0生态的兴起,去中心化云计算正逐步成为主流。它不仅颠覆了传统集中式云计算的架构,还为数据安全、隐私保护以及资源分配带来了新的可能性。在这一领域,Python因其简洁易用、社区庞大以及强大的工具链…...
HCIP【路由过滤技术(详解)】
目录 1 简介 2 路由过滤方法 3 路由过滤工具 3.1 静默接口 3.2 ACL 3.3 地址前缀列表 3.4 filter-policy 3.4.1 filter-policy过滤接收路由(以RIP为例) 3.4.2 filter-policy过滤接收路由(以OSPF为例) 1 简介 路由过滤技术…...
LeetCode Hot100 刷题笔记(3)—— 链表
目录 前言 1. 相交链表 2. 反转链表 3. 回文链表 4. 环形链表 5. 环形链表 II 6. 合并两个有序链表 7. 两数相加 8. 删除链表的倒数第 N 个结点 9. 两两交换链表中的节点 10. K 个一组翻转链表 11. 随机链表的复制 12. 排序链表 13. 合并 K 个升序链表 14. LRU 缓存 前言 一、…...
商品计费打折实现效果
1.创建php站点 2.创建php文件 3.执行php文件打开浏览器地址栏输入http://localhost/dophp/price.php页面如图所示: 4.表单输入,创建php文件price_form.php 运行效果为...
游戏引擎学习第207天
回顾并为今天的内容定下基调 我们正在继续上一次的任务,目的是构建一个基本的元编程系统,用来自动处理结构体信息,减少手动维护的代码量。具体来说,我们写了一个简单的预处理器,它可以解析代码中的结构体定义…...
Linux内核页表缓存(TLB)与巨型页
一、页表缓存(TLB) 处理器厂商在内存管理单元 (MMU) 里增加一个 TLB (Translation Lookaside Buffer) 的高速缓存,TLB 直译为转译后备缓冲器,也被翻译为页表缓存。 TLB 为 CPU 的一种缓存,由存储器管理单元用于…...
Web3(阶段一:入门)——默克尔树
什么是默克尔树 默克尔树(Merkle Tree),又称哈希树,是一种基于哈希算法的数据结构,用于高效验证数据完整性。其核心思想是将数据分块并逐层哈希,最终生成唯一的根哈希值。 核心特点: 结构分层…...
Qt Quick 与 Qt 版本匹配关系
一、核心版本对应关系 Qt 版本Qt Quick 版本重要特性Qt 5.0Qt Quick 2.0首次引入基于Scene Graph的架构Qt 5.12Qt Quick 2.12长期支持版(LTS),新增粒子系统增强Qt 5.15Qt Quick 2.15最后5.x LTS,改进3D集成Qt 6.0Qt Quick 6.0完全重写渲染架构,支持VulkanQt 6.2Qt Quick 6.2…...
DefaultListableBeanFactory
文章目录 DefaultListableBeanFactory介绍继承关系源码码解析属性成员getbean方法setAutowireCandidateResolver方法resolveDependency方法doResolveDependency方法findAutowireCandidates 方法determineAutowireCandidate 方法 DefaultListableBeanFactory介绍 BeanFactory是…...
软件工程面试题(三十二)
1、java程序每天12点打印”hello” public static void main(String[] args) {Date date = new Date(); System.out.println(date.getHours()); while (true) {while (date.getHours() == 12) {if (date.getMinutes() == 0) {if (date.getSeconds() == 0) {System.out.print…...
高频面试题(含笔试高频算法整理)基本总结回顾66
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
生成式人工智能(AIGC):内容创作的新引擎与新挑战
在数字化时代,内容创作的需求呈爆炸式增长。无论是社交媒体、新闻媒体、广告营销还是娱乐行业,都急需大量高质量的文本、图像、音频和视频内容。然而,传统的内容创作方式面临着效率低下、成本高昂、创意枯竭等问题。生成式人工智能࿰…...
Java 大视界 -- 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
react和vue在开发使用的语法上面有什么区别?
React和Vue在开发使用的语法上有诸多区别,下面从组件定义、数据绑定、事件处理、生命周期钩子等方面详细阐述: 1. 组件定义 React: 函数组件是React推荐的组件定义方式,它本质上是一个JavaScript函数,返回JSX元素。类…...
ReFormX:现代化的 React 表单解决方案 - 深度解析与最佳实践
ReFormX文档 表单开发一直是前端工作中最繁琐却又最常见的任务之一。从简单的登录表单到复杂的多步骤配置页面,开发者往往需要编写大量重复代码,处理繁琐的状态管理、数据验证和联动逻辑。ReFormX 应运而生,它不仅是一个表单组件库ÿ…...
STM32单片机入门学习——第19节: [6-7]TIM编码器接口
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.06 STM32开发板学习——第19节: [6-7]TIM编码器接口 前言开发板说明引用解答和科普一…...
Spring 中的 bean 生命周期
🌱 一、什么是 Bean 生命周期? 在 Spring 容器中,一个 Bean 从“创建 → 初始化 → 使用 → 销毁”,经历了完整的生命周期。 Spring 提供了 多个扩展点 让你可以在这些阶段做事情,比如注入资源、日志记录、连接资源、清…...
Kafka 在 k8s 中的消费者实例
每个 Pod(在 K8s 中运行的消费者实例)都会作为一个独立的消费者加入到 Kafka 消费者组中。 如果只是将消费者代码在 K8s 中复制多个实例(例如通过增加副本数),每个实例都会作为一个独立的消费者加入到 Kafka 消费者组…...
野草云防火墙风险分析及 Docker 使用注意事项
在实际使用野草云服务器部署 Docker 服务过程中,我发现了一个非常容易被忽视但极具风险的安全问题——野草云的防火墙逻辑与 Docker 默认行为之间存在冲突,如果配置不当,可能会导致容器服务被意外暴露在公网,甚至绕过你设置的“拒…...
C++中高精度运算问题
前言:在备赛蓝桥杯时,遇到C处理数值较大的浮点数问题,特此记录一下。 C 的 std::string 类使用动态内存分配,其长度可以根据需要动态增加或减少,自动调整内存大小以适应字符串内容的变化。当字符串长度超过当前分配的…...
开篇 - 配置Unlua+VsCode的智能提示、调试以及学习方法
智能提示 为要绑定Lua的蓝图创建模板文件,这会在Content/Script下生成lua文件 然后点击生成智能代码提示,这会在Plugins/Unlua/Intermediate/生成Intenllisense文件夹 打开VSCode,点击文件->将工作区另存为。生成一个空工作区,放置在工程…...
前端快速入门学习4——CSS盒子模型、浮动、定位
一、盒子模型 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,…...
在 ASP.NET Web Forms 项目中,编译后可能找不到 `Login.aspx.cs` 的源码文件的原因?
在 ASP.NET Web Forms 项目中,确实存在一种情况:编译后可能找不到 Login.aspx.cs 的源码文件。以下是对此现象的详细分析和解释: 1. 已知信息 您提供的 Web.config 文件显示这是一个 ASP.NET Web Forms 项目。在 ASP.NET 中,.asp…...
centos7 yum install docker 安装错误
1、错误信息: [rootlocalhost atguigu]# yum install docker 已加载插件:fastestmirror, langpacks Repository base is listed more than once in the configuration Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http:…...
spring mvc异步请求 sse 大文件下载 断点续传下载Range
学习连接 异步Servlet3.0 Spring Boot 处理异步请求(DeferredResult 基础案例、DeferredResult 超时案例、DeferredResult 扩展案例、DeferredResult 方法汇总) spring.io mvc Asynchronous Requests 官网文档 spring.io webflux&webclient官网文…...
Java项目集成大模型(通译千问)
1:打开阿里云搜索 通义大模型,然后点击丰富开发API接口。 2:可以看到有openAi和DashScope两种模式,我们这次采用DashScope方法,点击DashScope 3:点击获取Apikey 然后点击 前往我得Api-key跳转到控制台&…...
Lisp语言的安全协议
Lisp语言与安全协议的结合 引言 在信息社会的今天,数据的安全性和隐私保护愈发重要。随着网络攻击手段的不断演进,各种安全协议相继被提出与实现。与此同时,Lisp作为一种古老且灵活的计算机编程语言,虽然并不是主流的系统编程语…...
【图像处理基石】什么是自动曝光(AE)?
1. 什么是自动曝光(AE)? 自动曝光(Auto Exposure, AE)是一种通过调整相机参数(如曝光时间、增益、光圈等)使图像亮度达到目标值的技术。其核心是通过实时分析图像亮度,动态优化参数…...
清明假期间
1.思维导图 2.90题 3. #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std;class Weapon;class Hero{ private:int hp;…...
el-tabs添加按钮增加点击禁止样式
前置文章 一、vue使用element-ui自定义样式思路分享【实操】 二、vue3&ts&el-tabs多个tab表单校验 现状确认 点击添加按钮,没有点击样式,用户感知不明显没有限制最大的tab添加数量,可以无限添加 调整目标&代码编写 调整目标…...
Elasticsearch DSL 中的 aggs 聚合
一、聚合的概述 Elasticsearch 的 聚合(Aggregations) 功能用于对数据进行多维分析和统计,支持从简单的指标计算到复杂的分组分析。以下是聚合的基本结构: {"aggs": { // 也可以使用"agg…...
API调用类型全面指南:理解基础知识
在当今快速发展的数字化环境中,API(应用程序编程接口)是不同软件应用程序能够无缝通信的基石。无论是开发移动应用、集成第三方服务,还是构建强大的Web平台,理解各种API调用类型至关重要。那么,API调用到底…...
华东师范地面机器人融合空中无人机视角的具身导航!KiteRunner:语言驱动的户外环境合作式局部-全局导航策略
作者:Shibo Huang 1 ^{1} 1, Chenfan Shi 1 ^{1} 1, Jian Yang 2 ^{2} 2, Hanlin Dong 1 ^{1} 1, Jinpeng Mi 3 ^{3} 3, Ke Li 2 ^{2} 2, Jianfeng Zhang 1 ^{1} 1, Miao Ding 4 ^{4} 4, Peidong Liang 5 ^{5} 5, Xiong You 2 ^{2} 2, Xian Wei 1 ^{1} 1单位&#x…...
Ansible(6)——管理变量
目录 一、Ansible 变量: 1、什么是变量: 2、变量可能包含的值: 3、变量命名: 4、定义变量: 二、Playbook 中的变量: 1、在 Playbook 中定义变量: (1)最简单的定…...
Git常用问题收集
gitignore 忽略文件夹 不生效 有时候我们接手别人的项目时,发现有的忽略不对想要修改,但发现修改忽略.gitignore后无效。原因是如果某些文件已经被纳入版本管理在.gitignore中忽略路径是不起作用的,这时候需要先清除本地缓存,然后…...
构建高效多标签选择组件:从设计到实现
在现代Web应用中,多标签选择功能已成为常见需求,特别是在内容分类、文章标签、用户兴趣选择等场景。本文将深入解析一个完整的多标签选择实现方案,涵盖交互设计、核心功能和优化技巧。 组件功能概述 这个多标签选择组件提供以下核心功能&am…...
4.1论文阅读
一:PhDnet:一种用于遥感图像的新型物理感知去雾网络(A novel physic-aware dehazing network for remote sensing images) 论文链接 只是粗略读了一下,关于遥感图像去雾,圆形U--net,加入了物理…...