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

【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所示。

在这里插入图片描述

图1 Spark重要里程碑

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所示。

在这里插入图片描述

图2 Spark运行架构

  • Driver:任务驱动器,负责启动运行main()方法并创建SparkContext对象。
  • Cluster Manager:集群管理器,在集群上获取资源的外部服务,支持Standalone、Mesos和YARN这3种类型。
  • Worker Node:工作节点,集群中运行Application代码的任意一个节点。
  • Executor:运行在工作节点中的进程,负责运行Task,并为应用程序存储数据,在这个过程中,可能会将数据写入内存或磁盘进行缓存(Cache)。

(二)Spark运行流程

Spark运行基本流程如图3所示。

在这里插入图片描述

图3 Spark运行基本流程

  • 步骤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所示。

表1 常用的RDD转换算子
算子解释
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所示。

表2 RDD常用的行动算子
算子解释
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丢失时,可以通过血缘关系重新计算行动操作触发实际计算。

在这里插入图片描述

图4 一个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所示。

在这里插入图片描述

图5 RDD之间的窄依赖

宽依赖表现为父RDD的一个分区对应子RDD的多个分区。宽依赖典型的操作包括groupByKey()、sortByKey()等。如图6所示。

在这里插入图片描述

图6 RDD之间的宽依赖

Spark的依赖关系设计使其具有良好的容错性,并大大提升了执行速度。RDD通过血缘关系记录了它是如何从其他RDD中演变过来的。当某个RDD的部分分区数据丢失时,它可以通过血缘关系获取足够的信息,重新计算和恢复丢失的数据分区。

相对而言,窄依赖的失败恢复更为高效,只需要根据父RDD的分区重新计算丢失的分区即可,而不需要重新计算父RDD的所有分区。而对于宽依赖来说,即使只是单个节点失效导致RDD的一个分区失效,也需要重新计算父RDD的所有分区,开销较大。

宽依赖操作类似于将父RDD中所有分区的记录进行“洗牌”,数据被打散后在子RDD中进行重组。

(六)DAG阶段划分

DAG阶段划分的重要性:确定执行顺序,优化计算效率。

宽依赖会将DAG分为不同的阶段。不同阶段不能并行计算:后面阶段的RDD计算需要等待前面阶段RDD的所有分区全部计算完毕后才能进行。

RDD行动操作与阶段划分:从行动操作开始倒序划分阶段,窄依赖操作划分到同一个执行阶段,宽依赖操作划分到新的执行阶段。

示例:DAG阶段划分的详细过程。如图7所示。

在这里插入图片描述

图7 RDD之间的宽依赖

根据读入数据生成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所示。

表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所示。

在这里插入图片描述

图8 Spark生态圈

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&#xff0c;包括对数据的增删改查&#xff0c;可参照官方文档&#xff1a;Java High Level REST Client 二、使用步骤&#xff1a; 可参照官方文档操作 导包 <dependency><groupId>org.elasticsearch.client<…...

数字电子技术基础(三十九)——显示译码器

目录 1 显示译码器 1.1 显示译码器简介 1.2 七段显示译码器和八段显示译码器 1.3 BCD-七段显示译码器 1.4 多位显示译码器 1 显示译码器 1.1 显示译码器简介 显示译码器是一种数字电路&#xff0c;是将二进制转换为驱动显示设备所需要的信号&#xff0c;核心是将编码数据…...

Java学习总结-多线程-三种创建方法

什么是线程&#xff1f; 线程&#xff08;Thread&#xff09;是程序内部的一条执行流程。 程序如果只有一条执行流程&#xff0c;那这个程序就是单线程程序。 什么是多线程&#xff1f; 多线程是指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行…...

sqli-labs靶场 less 7

文章目录 sqli-labs靶场less 7 mysql文件上传拿web shell sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、…...

大模型最新面试题系列:模型部署(二)

一、如何通过unsloth的批处理&#xff08;Batching&#xff09;功能提升推理效率&#xff1f; Unsloth的批处理&#xff08;Batching&#xff09;功能通过整合硬件加速、内存优化和动态调度技术&#xff0c;显著提升大模型推理效率。以下是具体实现方法和实际应用场景的深度解…...

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过滤接收路由&#xff08;以RIP为例&#xff09; 3.4.2 filter-policy过滤接收路由&#xff08;以OSPF为例&#xff09; 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页面如图所示&#xff1a; 4.表单输入&#xff0c;创建php文件price_form.php 运行效果为...

游戏引擎学习第207天

回顾并为今天的内容定下基调 我们正在继续上一次的任务&#xff0c;目的是构建一个基本的元编程系统&#xff0c;用来自动处理结构体信息&#xff0c;减少手动维护的代码量。具体来说&#xff0c;我们写了一个简单的预处理器&#xff0c;它可以解析代码中的结构体定义&#xf…...

Linux内核页表缓存(TLB)与巨型页

一、页表缓存&#xff08;TLB&#xff09; 处理器厂商在内存管理单元 (MMU) 里增加一个 TLB (Translation Lookaside Buffer) 的高速缓存&#xff0c;TLB 直译为转译后备缓冲器&#xff0c;也被翻译为页表缓存。 TLB 为 CPU 的一种缓存&#xff0c;由存储器管理单元用于…...

Web3(阶段一:入门)——默克尔树

什么是默克尔树 默克尔树&#xff08;Merkle Tree&#xff09;&#xff0c;又称哈希树&#xff0c;是一种基于哈希算法的数据结构&#xff0c;用于高效验证数据完整性。其核心思想是将数据分块并逐层哈希&#xff0c;最终生成唯一的根哈希值。 核心特点&#xff1a; 结构分层…...

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

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

生成式人工智能(AIGC):内容创作的新引擎与新挑战

在数字化时代&#xff0c;内容创作的需求呈爆炸式增长。无论是社交媒体、新闻媒体、广告营销还是娱乐行业&#xff0c;都急需大量高质量的文本、图像、音频和视频内容。然而&#xff0c;传统的内容创作方式面临着效率低下、成本高昂、创意枯竭等问题。生成式人工智能&#xff0…...

Java 大视界 -- 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

react和vue在开发使用的语法上面有什么区别?

React和Vue在开发使用的语法上有诸多区别&#xff0c;下面从组件定义、数据绑定、事件处理、生命周期钩子等方面详细阐述&#xff1a; 1. 组件定义 React&#xff1a; 函数组件是React推荐的组件定义方式&#xff0c;它本质上是一个JavaScript函数&#xff0c;返回JSX元素。类…...

ReFormX:现代化的 React 表单解决方案 - 深度解析与最佳实践

ReFormX文档 表单开发一直是前端工作中最繁琐却又最常见的任务之一。从简单的登录表单到复杂的多步骤配置页面&#xff0c;开发者往往需要编写大量重复代码&#xff0c;处理繁琐的状态管理、数据验证和联动逻辑。ReFormX 应运而生&#xff0c;它不仅是一个表单组件库&#xff…...

STM32单片机入门学习——第19节: [6-7]TIM编码器接口

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.06 STM32开发板学习——第19节: [6-7]TIM编码器接口 前言开发板说明引用解答和科普一…...

Spring 中的 bean 生命周期

&#x1f331; 一、什么是 Bean 生命周期&#xff1f; 在 Spring 容器中&#xff0c;一个 Bean 从“创建 → 初始化 → 使用 → 销毁”&#xff0c;经历了完整的生命周期。 Spring 提供了 多个扩展点 让你可以在这些阶段做事情&#xff0c;比如注入资源、日志记录、连接资源、清…...

Kafka 在 k8s 中的消费者实例

每个 Pod&#xff08;在 K8s 中运行的消费者实例&#xff09;都会作为一个独立的消费者加入到 Kafka 消费者组中。 如果只是将消费者代码在 K8s 中复制多个实例&#xff08;例如通过增加副本数&#xff09;&#xff0c;每个实例都会作为一个独立的消费者加入到 Kafka 消费者组…...

野草云防火墙风险分析及 Docker 使用注意事项

在实际使用野草云服务器部署 Docker 服务过程中&#xff0c;我发现了一个非常容易被忽视但极具风险的安全问题——野草云的防火墙逻辑与 Docker 默认行为之间存在冲突&#xff0c;如果配置不当&#xff0c;可能会导致容器服务被意外暴露在公网&#xff0c;甚至绕过你设置的“拒…...

C++中高精度运算问题

前言&#xff1a;在备赛蓝桥杯时&#xff0c;遇到C处理数值较大的浮点数问题&#xff0c;特此记录一下。 C 的 std::string 类使用动态内存分配&#xff0c;其长度可以根据需要动态增加或减少&#xff0c;自动调整内存大小以适应字符串内容的变化。当字符串长度超过当前分配的…...

开篇 - 配置Unlua+VsCode的智能提示、调试以及学习方法

智能提示 为要绑定Lua的蓝图创建模板文件&#xff0c;这会在Content/Script下生成lua文件 然后点击生成智能代码提示&#xff0c;这会在Plugins/Unlua/Intermediate/生成Intenllisense文件夹 打开VSCode,点击文件->将工作区另存为。生成一个空工作区&#xff0c;放置在工程…...

前端快速入门学习4——CSS盒子模型、浮动、定位

一、盒子模型 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c;它包括&#xff1a;边距&#xff0c;边框&#xff0c;填充&#xff0c…...

在 ASP.NET Web Forms 项目中,编译后可能找不到 `Login.aspx.cs` 的源码文件的原因?

在 ASP.NET Web Forms 项目中&#xff0c;确实存在一种情况&#xff1a;编译后可能找不到 Login.aspx.cs 的源码文件。以下是对此现象的详细分析和解释&#xff1a; 1. 已知信息 您提供的 Web.config 文件显示这是一个 ASP.NET Web Forms 项目。在 ASP.NET 中&#xff0c;.asp…...

centos7 yum install docker 安装错误

1、错误信息&#xff1a; [rootlocalhost atguigu]# yum install docker 已加载插件&#xff1a;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 处理异步请求&#xff08;DeferredResult 基础案例、DeferredResult 超时案例、DeferredResult 扩展案例、DeferredResult 方法汇总&#xff09; spring.io mvc Asynchronous Requests 官网文档 spring.io webflux&webclient官网文…...

Java项目集成大模型(通译千问)

1&#xff1a;打开阿里云搜索 通义大模型&#xff0c;然后点击丰富开发API接口。 2&#xff1a;可以看到有openAi和DashScope两种模式&#xff0c;我们这次采用DashScope方法&#xff0c;点击DashScope 3&#xff1a;点击获取Apikey 然后点击 前往我得Api-key跳转到控制台&…...

Lisp语言的安全协议

Lisp语言与安全协议的结合 引言 在信息社会的今天&#xff0c;数据的安全性和隐私保护愈发重要。随着网络攻击手段的不断演进&#xff0c;各种安全协议相继被提出与实现。与此同时&#xff0c;Lisp作为一种古老且灵活的计算机编程语言&#xff0c;虽然并不是主流的系统编程语…...

【图像处理基石】什么是自动曝光(AE)?

1. 什么是自动曝光&#xff08;AE&#xff09;&#xff1f; 自动曝光&#xff08;Auto Exposure, AE&#xff09;是一种通过调整相机参数&#xff08;如曝光时间、增益、光圈等&#xff09;使图像亮度达到目标值的技术。其核心是通过实时分析图像亮度&#xff0c;动态优化参数…...

清明假期间

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表单校验 现状确认 点击添加按钮&#xff0c;没有点击样式&#xff0c;用户感知不明显没有限制最大的tab添加数量&#xff0c;可以无限添加 调整目标&代码编写 调整目标…...

Elasticsearch DSL 中的 aggs 聚合

一、聚合的概述 Elasticsearch 的 聚合&#xff08;Aggregations&#xff09; 功能用于对数据进行多维分析和统计&#xff0c;支持从简单的指标计算到复杂的分组分析。以下是聚合的基本结构&#xff1a; {"aggs": { // 也可以使用"agg…...

API调用类型全面指南:理解基础知识

在当今快速发展的数字化环境中&#xff0c;API&#xff08;应用程序编程接口&#xff09;是不同软件应用程序能够无缝通信的基石。无论是开发移动应用、集成第三方服务&#xff0c;还是构建强大的Web平台&#xff0c;理解各种API调用类型至关重要。那么&#xff0c;API调用到底…...

华东师范​地面机器人融合空中无人机视角的具身导航!KiteRunner:语言驱动的户外环境合作式局部-全局导航策略

作者&#xff1a;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 变量&#xff1a; 1、什么是变量&#xff1a; 2、变量可能包含的值&#xff1a; 3、变量命名&#xff1a; 4、定义变量&#xff1a; 二、Playbook 中的变量&#xff1a; 1、在 Playbook 中定义变量&#xff1a; &#xff08;1&#xff09;最简单的定…...

Git常用问题收集

gitignore 忽略文件夹 不生效 有时候我们接手别人的项目时&#xff0c;发现有的忽略不对想要修改&#xff0c;但发现修改忽略.gitignore后无效。原因是如果某些文件已经被纳入版本管理在.gitignore中忽略路径是不起作用的&#xff0c;这时候需要先清除本地缓存&#xff0c;然后…...

构建高效多标签选择组件:从设计到实现

在现代Web应用中&#xff0c;多标签选择功能已成为常见需求&#xff0c;特别是在内容分类、文章标签、用户兴趣选择等场景。本文将深入解析一个完整的多标签选择实现方案&#xff0c;涵盖交互设计、核心功能和优化技巧。 组件功能概述 这个多标签选择组件提供以下核心功能&am…...

4.1论文阅读

一&#xff1a;PhDnet&#xff1a;一种用于遥感图像的新型物理感知去雾网络&#xff08;A novel physic-aware dehazing network for remote sensing images&#xff09; 论文链接 只是粗略读了一下&#xff0c;关于遥感图像去雾&#xff0c;圆形U--net&#xff0c;加入了物理…...