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

技术周总结 2024.07.15~07.21周日(Spark性能优化)

文章目录

  • 一、07.19 周五
    • 1.1)问题01: spark性能优化
    • 1.2)问题02: spark是怎么应用在机器学习领域的
    • 1.3)问题03:spark自带工具有哪些?
    • 1.4)问题04: spark日志的知识点有哪些
    • 1.5) 问题05:spark的监控工具有哪些?
      • 1. Spark Web UI
      • 2. Spark History Server
      • 3. Ganglia
      • 4. Graphite
      • 5. Prometheus and Grafana
      • 6. Third-party Tools
    • 1.6)问题06:怎么查询使用的spark版本
  • 二、07.20 周六
    • 2.1)问题01:在Spark WebUI中,job详情的DAG Visualization 说的 mapPartitions,WholeStageCodegen,InMemoryTableScan, Exchange, CartesianProduct 都代表什么含义?
    • 2.2)问题02: spark webUI的 job 详情中Skipped Stages (10)代表什么?
    • 2.3)问题03: spark-doris-connector的源码赏析
      • 2.3.1)解释代码 AbstractDorisRDD
    • 2.4)问题04: spark中 driver的角色:
  • 三、07.21 周日
    • 3.1)问题01: spark SQL的优化器进行的优化操作有哪些?怎么理解这些操作
    • 3.2)问题02:Spark SQL join优化的 广播Join, 小表广播,排序合并Join怎么理解?
      • 1. 广播Join(Broadcast Join)
        • 优点:
        • 缺点:
      • 2. 小表广播(Small Table Broadcast)
        • 优点:
        • 缺点:
      • 3. 排序合并Join(Sort-Merge Join)
        • 步骤:
        • 优点:
        • 缺点:
      • 总结
    • 3.3)问题03:spark的配置 spark.default.parallelism 和 spark.sql.shuffle.partitions和 spark.sql.autoBroadcastJoinThreshold 怎么理解
    • 3.4)问题04:这样类似spark.default.parallelism的配置参数还有哪些?
    • 3.5)问题05:怎么把已经得到的spark的事件日志json文件导入并在 spark webUI中解析并可视化展示?
      • 前提条件
      • 步骤
      • 详细步骤解释
      • 注意事项

一、07.19 周五

1.1)问题01: spark性能优化

Apache Spark 性能优化是一个涉及多个层面的过程,旨在提高数据处理速度、减少资源消耗,并确保任务高效执行。以下是一些关键的Spark性能调优策略:

  1. 数据倾斜处理

    • 数据倾斜是导致Spark作业运行缓慢的常见原因。可以通过增加spark.sql.shuffle.partitions配置值来增加shuffle阶段的分区数,或者使用repartitioncoalesce操作手动调整分区,以均衡数据分布。
    • 使用salting技巧对键进行散列,分散热点键。
  2. 内存管理

    • 调整spark.executor.memoryspark.driver.memory以适应作业需求,避免内存溢出。
    • 通过设置spark.memory.fractionspark.memory.storageFraction合理分配内存给执行任务和存储。
  3. 并行度调整

    • 适当增加任务的并行度(通过spark.default.parallelism配置),可以充分利用集群资源,但需避免过度并行导致资源竞争。
  4. Shuffle优化

    • 使用spark.shuffle.file.buffer增加shuffle文件缓冲区大小,减少磁盘I/O。
    • 开启spark.shuffle.compress压缩shuffle数据,减少网络传输负担。
    • 考虑使用spark.shuffle.manager配置为sorttungsten-sort(取决于Spark版本),以利用更高效的排序算法。
  5. 序列化优化

    • 使用Kryo序列化代替Java序列化,因为Kryo通常更快且更紧凑。
    • 配置需要序列化的类,使用spark.serializer设置为org.apache.spark.serializer.KryoSerializer
  6. 推测执行

    • 开启推测执行(spark.speculation=true)可以加快因数据倾斜导致的慢任务完成,但可能会增加资源消耗。
  7. 缓存与持久化

    • 利用persistcache将频繁访问的数据集存储在内存中或磁盘上,选择合适的存储级别以平衡性能和资源。
  8. 动态资源分配

    • 启用动态资源分配(spark.dynamicAllocation.enabled=true)允许Spark根据当前工作负载自动增减executor数量。
  9. JVM与GC调优

    • 适当调整JVM参数,如新生代和老年代的比例,以及GC策略,以减少垃圾回收的开销。
  10. SQL优化

    • 在使用Spark SQL时,优化查询计划,尽量减少shuffle操作,利用DataFrame/Dataset API的优化能力。
  11. 监控与日志分析

    • 使用Spark UI监控作业运行情况,识别瓶颈。通过日志分析发现问题,比如特定任务的执行时间过长。

以上策略应结合具体的应用场景和资源限制进行调整和测试,以找到最佳配置。

1.2)问题02: spark是怎么应用在机器学习领域的

Apache Spark 在机器学习领域的应用主要通过其内置的机器学习库——Spark MLlib(Machine Learning Library)实现。以下是Spark在机器学习中的一些关键应用方式:

  1. 大规模数据处理:Spark 提供了高效的数据处理能力,能够处理海量数据集,这对于机器学习尤为重要,因为许多机器学习算法需要在大量数据上进行训练才能获得准确的模型。

  2. 分布式计算:通过利用分布式计算框架,Spark 可以并行处理数据和计算任务,显著加快训练速度,尤其是在涉及复杂模型和大数据集时。

  3. 算法和模型:Spark MLlib 包含多种机器学习算法,包括分类、回归、聚类、协同过滤等,以及特征抽取和转换工具,方便数据科学家和工程师直接应用到问题解决中。

  4. 流水线(Pipeline):Spark 引入了机器学习流水线的概念,使得数据预处理、特征工程、模型训练、评估和预测等步骤能够以模块化的方式组织起来,易于构建、调试和维护复杂的机器学习工作流。

  5. 模型评估与选择:提供了模型选择和评估工具,如交叉验证、度量标准(如准确率、召回率、F1分数等),帮助用户比较和选择最佳模型。

  6. 高阶API:除了底层的RDD API,Spark还提供了DataFrame和Dataset API,这些高层API更加用户友好,同时也能自动优化执行计划,进一步提升机器学习任务的效率。

  7. 交互式探索:结合Spark与诸如Jupyter Notebook的工具,数据科学家可以进行交互式数据分析和模型迭代,快速验证假设。

  8. 深度学习集成:虽然Spark本身不直接提供深度学习框架,但它可以与TensorFlow、PyTorch等深度学习库集成,通过Spark的分布式计算能力加速深度学习模型的训练过程。

  9. 持续学习与在线预测:Spark Streaming和Structured Streaming支持实时数据处理,使得模型可以在新的数据流入时不断更新,适用于实时预测和在线学习场景。

  10. 生产环境部署:Spark MLlib支持模型的保存与加载,便于将训练好的模型部署到生产环境中,进行实时或批处理预测。

综上所述,Spark凭借其强大的数据处理能力和丰富的机器学习工具箱,成为了机器学习领域中处理大规模数据、构建和部署模型的重要平台。

1.3)问题03:spark自带工具有哪些?

Apache Spark 自带了一系列工具和命令行接口,用于管理和执行各种大数据处理任务。以下是一些核心的Spark自带工具:

  1. spark-submit: 用于提交Spark应用程序到Spark集群的命令行工具。用户可以通过它提交用Scala、Java、Python或R编写的Spark作业。

  2. spark-shell: Spark的交互式Shell,提供了编写和执行Spark应用程序的交互环境。它支持Scala、Python(pyspark)和R(SparkR)语言。在shell中可以直接操作RDD、DataFrame和DataSet,非常适合快速原型设计和数据探索。

  3. pyspark: 特别针对Python用户的Spark交互式Shell,提供了Python接口来操作Spark。

  4. sparkR: 为R语言用户提供的Spark接口,允许在R环境中直接使用Spark进行大数据分析。

  5. spark-sql: 用于启动Spark SQL的命令行界面,支持SQL查询和DataFrame操作,也可以用来与Hive集成。

  6. spark-history-server: Spark历史服务器,用于展示已完成的Spark应用程序的运行详情,包括任务执行进度、资源使用情况等,是故障排查和性能分析的重要工具。

  7. spark-webui: Spark的Web用户界面,提供了作业监控、执行阶段详情、资源管理等信息,可通过浏览器访问。

  8. spark-worker: Spark工作节点的守护进程,负责执行由Driver分配的任务。

  9. spark-master: Spark集群的主节点守护进程,负责管理和协调Worker节点及运行中的Spark应用程序。

  10. spark-class: 用于启动Spark各种组件的脚本,如上述提到的shell、历史服务器等。

这些工具共同构成了Spark强大的生态系统,使得开发者和数据工程师能够方便地进行大数据处理、分析、机器学习以及图计算等任务。

1.4)问题04: spark日志的知识点有哪些

Spark日志是理解和调试Spark应用程序运行情况的关键资源,它记录了任务执行过程中的详细信息,包括但不限于任务调度、执行状态、错误信息以及性能指标。以下是关于Spark日志的一些重要知识点:

  1. 日志的重要性

    • 故障排查:日志可以帮助识别和定位Spark应用程序执行过程中出现的问题,比如任务失败、数据倾斜、资源不足等。
    • 性能分析:通过日志可以分析任务执行时间、资源消耗情况,进而优化应用程序性能。
    • 监控:实时日志分析可以提供应用程序运行状况的即时反馈,便于监控和报警设置。
    • 审计与合规:日志记录了所有操作,对于安全审计和满足合规要求至关重要。
  2. 日志的层次结构

    • Spark日志分为不同层级,包括Driver日志、ApplicationMaster (AM)日志以及Executor日志,每个层级的日志记录了不同方面和位置的信息。
  3. 日志的配置

    • Spark日志的配置可以通过Spark配置项(如spark.executor.logs.*spark.eventLog.*)进行细致调整,包括日志级别(DEBUG、INFO、WARN、ERROR)、日志目录、滚动策略等。
    • 可以利用log4j、logback等日志框架进行更细粒度的控制。
  4. 日志输出位置

    • 日志可以输出到本地文件系统、HDFS或通过日志聚合系统(如Fluentd、Logstash)收集。
    • Spark History Server可以收集和展示已结束应用的历史日志。
  5. 日志格式

    • Spark支持多种日志格式,包括传统的文本格式和JSON格式,其中JSON格式便于机器解析和自动化分析。
    • Spark 2.x及以后版本的事件日志采用SparK Event Logging,记录了详细的作业执行事件,支持通过Spark History Server或第三方工具进行分析。
  6. 日志分析与优化

    • 利用工具(如Spark本身的web UI、Spark History Server)或自定义脚本分析日志,提取关键指标。
    • 通过日志可以发现和优化数据倾斜、内存溢出等问题。
  7. 推测执行与日志

    • 当推测执行开启时,相同任务的多个实例可能产生额外的日志,需注意区分和解析。
  8. 日志压缩与清理

    • 根据集群资源和存储需求,合理设置日志压缩和自动清理策略,避免占用过多存储空间。

掌握这些知识点有助于更好地管理和利用Spark日志,从而提高开发和运维效率。

1.5) 问题05:spark的监控工具有哪些?

Apache Spark 提供了多种监控和管理工具,用于监控 Spark 应用程序的性能和资源使用情况。以下是一些常用的 Spark 监控工具:

1. Spark Web UI

Spark 自带的 Web UI 提供了详细的作业(Job)、阶段(Stage)和任务(Task)信息。可以通过 SparkContext 的 http://<driver>:4040 地址访问。以下是 Web UI 提供的主要信息:

  • Jobs 页面:显示所有的作业及其状态(成功、失败、运行中)。
  • Stages 页面:显示每个阶段的详细信息,包括任务数量、输入输出数据量等。
  • Tasks 页面:显示任务的详细信息,包括运行时间、输入输出数据量、错误信息等。
  • Storage 页面:显示 RDD 和 DataFrame 的存储信息。
  • Environment 页面:显示 Spark 的环境信息,包括配置、JVM 属性、类路径等。
  • Executors 页面:显示每个 Executor 的详细信息,包括内存和磁盘使用情况、任务数量、运行时间等。

2. Spark History Server

Spark History Server 提供了对已经完成的应用程序的监控和管理功能。可以通过保存应用程序的事件日志来查看过去的作业和阶段信息。配置和启动 Spark History Server 的步骤如下:

  1. 启用事件日志记录:

    spark.eventLog.enabled=true
    spark.eventLog.dir=hdfs://path/to/eventLog
    
  2. 启动 History Server:

    ./sbin/start-history-server.sh
    
  3. 访问 History Server:

    http://<host>:18080
    

3. Ganglia

Ganglia 是一个分布式监控系统,可以用于监控 Spark 集群的性能。通过集成 Ganglia,可以收集和可视化集群的 CPU、内存、网络等资源使用情况。

配置步骤:

  1. 安装 Ganglia 并配置 Ganglia gmond。

  2. 配置 Spark 以使用 Ganglia 进行监控:

    spark.metrics.conf
    
  3. 使用 Ganglia Web 界面查看监控数据。

4. Graphite

Graphite 是一个企业级监控工具,可以收集和存储时间序列数据。通过将 Spark 的监控数据发送到 Graphite,可以进行详细的性能分析和监控。

配置步骤:

  1. 安装 Graphite 并配置 Carbon 和 Whisper。

  2. 配置 Spark 以使用 Graphite 进行监控:

    spark.metrics.conf
    
  3. 使用 Graphite-Web 或 Grafana 查看监控数据。

5. Prometheus and Grafana

Prometheus 是一个开源的系统监控和警报工具,Grafana 是一个开源的分析和监控平台。通过将 Spark 的监控数据发送到 Prometheus,并使用 Grafana 进行可视化,可以实现强大的监控和分析功能。

配置步骤:

  1. 安装 Prometheus 并配置 Prometheus Server。

  2. 安装和配置 Grafana。

  3. 配置 Spark 以使用 Prometheus 进行监控:

    spark.metrics.conf
    
  4. 使用 Grafana 创建仪表板以可视化 Spark 的监控数据。

6. Third-party Tools

除了以上工具,还有一些第三方工具可以用于监控 Spark 应用程序,如 Dr. Elephant、Cloudera Manager、Ambari 等。这些工具提供了更高级的监控、调优和管理功能,可以更好地支持大型 Spark 集群的管理。

通过以上这些工具,您可以全面监控和管理 Spark 应用程序的性能,及时发现和解决性能瓶颈和资源瓶颈,从而提高应用程序的性能和稳定性。

1.6)问题06:怎么查询使用的spark版本

查询Spark版本有几种常用的方法,具体取决于你是通过什么方式访问或使用Spark的。以下是几种典型场景下的查询方法:

  1. 通过Spark Shell
    如果你已经启动了Spark Shell,可以直接在Shell中输入以下命令来查看Spark的版本信息:

    spark.version
    

    按下回车后,Shell会输出当前Spark的版本号。

  2. 在Spark应用程序中
    如果你正在编写Spark应用程序(使用Scala、Java、Python等),可以在程序中加入如下代码来获取并打印Spark版本:

    • Scala/Java:
      import org.apache.spark.sql.SparkSession
      val spark = SparkSession.builder().getOrCreate()
      println(s"Spark Version: ${spark.version}")
      
    • Python (PySpark):
      from pyspark.sql import SparkSession
      spark = SparkSession.builder.getOrCreate()
      print(f"Spark Version: {spark.version}")
      
  3. 命令行查询(Spark Submit或Spark-Shell启动时)
    当你通过命令行使用spark-submit提交应用或者直接启动spark-shell时,在命令中添加--version或者-v选项,如:

    spark-submit --version
    

    spark-shell -v
    

    运行上述命令后,系统会直接输出Spark的版本信息,然后退出。

  4. 检查集群管理界面
    如果你的Spark部署在诸如Hadoop YARN、Apache Mesos或Kubernetes等集群管理器上,通常可以通过集群的Web管理界面查看运行的Spark应用及其版本信息。

  5. 检查配置文件或安装目录
    在某些情况下,你也可以直接检查Spark的安装目录,特别是在没有运行中的Spark应用时。Spark的版本信息通常包含在解压后的目录名称中,或者你可以在conf/spark-env.sh(或相应环境配置文件)中查找是否有版本相关的注释或设置。但这种方法不如上述方法直接可靠,因为实际运行的版本可能因不同环境变量或配置而有所不同。

请根据你的实际情况选择合适的方法进行查询。

二、07.20 周六

2.1)问题01:在Spark WebUI中,job详情的DAG Visualization 说的 mapPartitions,WholeStageCodegen,InMemoryTableScan, Exchange, CartesianProduct 都代表什么含义?

这些术语主要是在Spark等大数据处理框架中常见的一些概念,它们分别代表了不同的数据处理操作:

  1. mapPartitions:mapPartitions是Spark中的一个转换操作,它可以对RDD中的每个分区进行处理,通常用于执行一些需要在每个分区上进行的操作,比如对分区内的数据进行映射转换。

  2. WholeStageCodegen:WholeStageCodegen是Spark SQL中的一个优化技术,它可以将多个连续的算子合并为一个整体的计算任务,以减少计算过程中的开销,提高执行效率。

  3. InMemoryTableScan:InMemoryTableScan是Spark中的一个操作,表示在内存中扫描表格,通常用于快速访问内存中的数据表,以加快查询速度。

  4. Exchange:Exchange是Spark中的一个转换操作,用于在不同的分区之间进行数据交换,比如进行数据洗牌操作或者数据重分区。

  5. CartesianProduct:CartesianProduct是指两个数据集进行笛卡尔积操作,即将一个数据集中的每个元素与另一个数据集中的每个元素组合,生成新的数据集。

这些概念在大数据处理中起着重要的作用,了解它们可以帮助优化数据处理流程,提高计算效率。

2.2)问题02: spark webUI的 job 详情中Skipped Stages (10)代表什么?

“Skipped Stages (10)” 表示在作业执行过程中跳过了10个阶段。这可能是因为系统已经缓存了一些计算结果,或者因为作业的某些部分并不需要执行。通常情况下,跳过一些阶段可以提高作业的执行效率和速度。

2.3)问题03: spark-doris-connector的源码赏析

2.3.1)解释代码 AbstractDorisRDD

private[spark] abstract class AbstractDorisRDD[T: _root_.scala.reflect.ClassTag](sc: _root_.org.apache.spark.SparkContext, val params: _root_.scala.Predef.Map[_root_.scala.Predef.String, _root_.scala.Predef.String] = ???) extends _root_.org.apache.spark.rdd.RDD[T] {

这段代码定义了一个抽象类 AbstractDorisRDD,该类是 Spark 内部使用的,不对外公开(private[spark])。这个类继承自 Spark 的 RDD 类,表示这是一个 Spark RDD 的实现。

构造函数接受一个 SparkContext 对象 sc 和一个参数 params,params 是一个 Map 类型,其中键和值都是 String 类型。这里的 ??? 表示参数 params 的默认值未定义,需要在子类中具体实现。

另外,这个类使用了 Scala 的类型参数 T,要求 T 必须有 ClassTag。整体来说,这段代码定义了一个抽象的 Doris RDD 类,具体实现需要在子类中完成。

2.4)问题04: spark中 driver的角色:

在Spark中,driver是指负责整个应用程序的执行、协调和控制的进程。在SparkSession创建时,会自动创建一个driver进程,它负责与集群管理器进行通信、调度任务、监控任务执行情况等。在Spark应用程序运行期间,driver会负责将用户编写的代码转换为任务,并将这些任务分发给集群中的executor进程执行。因此,driver可以看作是Spark应用程序的控制中心。

三、07.21 周日

3.1)问题01: spark SQL的优化器进行的优化操作有哪些?怎么理解这些操作

Spark SQL的优化器主要进行以下几类优化操作:

  1. 谓词下推 (Predicate Pushdown)
    谓词下推是指将过滤条件尽量提前到数据源读取阶段执行,从而减少数据读取量。例如,在读取数据时就应用过滤条件,而不是等数据全部读入后再进行过滤。

  2. 投影下推 (Projection Pushdown)
    投影下推是指将只需要的列提前到数据源读取阶段选取,从而减少数据传输和处理量。例如,只读取需要的列而不是整个表。

  3. 常量折叠 (Constant Folding)
    常量折叠是指在编译阶段对表达式中的常量进行计算,从而减少运行时的计算量。例如,将 3 + 4 在编译阶段直接计算为 7

  4. 谓词合并 (Predicate Merge)
    谓词合并是指将多个过滤条件合并成一个条件,从而优化过滤操作。例如,将 WHERE a > 5 AND a < 10 合并成一个范围条件。

  5. 谓词简化 (Predicate Simplification)
    谓词简化是指对复杂的谓词条件进行简化,从而优化查询。例如,将 WHERE a = 1 OR a = 1 简化为 WHERE a = 1

  6. 重写查询计划 (Query Plan Rewriting)
    重写查询计划是指通过等价转换优化查询计划。例如,将笛卡尔积转换为等值连接。

  7. 子查询消除 (Subquery Elimination)
    子查询消除是指将子查询优化为等价的简单查询,从而减少开销。例如,将 SELECT * FROM (SELECT * FROM table) 优化为 SELECT * FROM table

  8. Join优化
    Join优化包括广播Join、小表广播、排序合并Join等策略,以减少数据传输和计算量。例如,将小表广播到各个节点,减少网络传输。

  9. 数据倾斜处理 (Skew Handling)
    数据倾斜处理是指通过优化数据分布,减少某些节点负载过重的情况。例如,通过对倾斜键进行拆分。

  10. 缓存 (Caching)
    缓存是指将中间结果缓存到内存中,从而加速后续操作。例如,将频繁使用的中间结果缓存起来,避免重复计算。

这些优化操作的核心思想是减少数据传输和计算量,提高查询执行效率。理解这些操作有助于我们编写高效的SQL查询,并能更好地调优Spark SQL应用。

3.2)问题02:Spark SQL join优化的 广播Join, 小表广播,排序合并Join怎么理解?

在分布式计算和大数据处理环境中,Join操作是非常常见的操作,用于将两个数据集按照某个条件进行合并。针对不同的数据规模和分布,有不同的Join策略来优化性能。以下是广播Join、小表广播和排序合并Join的解释:

1. 广播Join(Broadcast Join)

广播Join是一种优化的Join策略,适用于一个表非常小而另一个表非常大的情况。具体做法是将小表广播到所有的计算节点,然后在每个节点上执行Join操作。这样可以避免大表的数据在网络中的大量传输。

优点:
  • 减少网络传输开销。
  • 适用于小表和大表Join的情况。
缺点:
  • 小表不能太大,否则会占用大量的内存。

2. 小表广播(Small Table Broadcast)

小表广播实际上就是广播Join的具体应用。这里的小表广播特指将较小的表复制到所有的计算节点,这样每个节点在处理大表分片时都可以直接访问小表,从而进行Join操作。

优点:
  • 和广播Join类似,减少了大表的数据传输。
  • 提升了Join操作的效率。
缺点:
  • 小表的大小受限于单个节点的内存容量。

3. 排序合并Join(Sort-Merge Join)

排序合并Join是一种适用于大规模数据集的Join策略,特别是当两个表都已经按Join键排序时。它的基本思想是对两个表分别进行排序,然后通过合并两个有序列表来完成Join操作。

步骤:
  1. 对两个表按照Join键进行排序。
  2. 使用双指针或多路归并的方式合并两个有序表,找到匹配的记录。
优点:
  • 对于已经排序的数据,性能非常高。
  • 可以处理大规模数据集。
缺点:
  • 需要对数据进行排序,排序操作的开销较大。
  • 适用于Join键上有索引或者自然有序的数据。

总结

  • 广播Join小表广播 适用于一个表很小、另一个表很大的情况,通过将小表广播到所有计算节点来减少网络传输开销。
  • 排序合并Join 适用于两个大表的Join,尤其是当数据已经按Join键排序时,通过排序和合并来高效地完成Join操作。

选择哪种Join策略取决于数据的规模、分布和具体的应用场景。

3.3)问题03:spark的配置 spark.default.parallelism 和 spark.sql.shuffle.partitions和 spark.sql.autoBroadcastJoinThreshold 怎么理解

在 Apache Spark 中,以下配置参数是非常重要的,它们可以显著影响应用程序的性能和资源使用情况:

  1. spark.default.parallelism:

    • 含义:这个参数定义了默认的并行度,即任务(tasks)的数量。它通常用于非 SQL 操作,例如 RDD 转换。
    • 默认值:如果未设置,默认值为 2 * 总核心数
    • 作用:这个参数决定了在进行宽依赖(如 shuffle 操作)时,任务的并行度。例如,在做 reduceByKey 这样的操作时,会根据这个并行度来划分任务。
    • 调优建议:一般建议设置为集群中核心数的 2-3 倍,以确保充分利用资源。
  2. spark.sql.shuffle.partitions:

    • 含义:这个参数控制 Spark SQL 中 shuffle 操作(如 joingroupByorderBy 等)所使用的分区数量。
    • 默认值:默认值为 200。
    • 作用:在进行 SQL 操作时,Spark 会将数据进行 shuffle,并根据该参数决定生成多少个分区。分区数量过少可能导致单个任务数据量过大,内存不足;分区数量过多则可能导致调度和管理开销增大。
    • 调优建议:根据数据规模和集群资源情况,适当增大或减小该值。例如,对于大规模数据集,可以增大该值以减少每个分区的数据量。
  3. spark.sql.autoBroadcastJoinThreshold:

    • 含义:这个参数定义了 Spark SQL 自动进行广播 join 的阈值。广播 join 是一种优化策略,当一张表非常小(小于该阈值)时,Spark 会将其广播到所有工作节点上,与另一张表进行 join 操作。
    • 默认值:默认值为 10MB(10485760 字节)。
    • 作用:当一张表的大小小于该阈值时,Spark 会自动选择广播 join。这种方式可以显著减少 shuffle 的开销,提升 join 操作的性能。
    • 调优建议:如果有很多小表 join,可以适当增大该值;如果广播表过大,可能会导致内存问题,需要适当减小该值。

理解和合理配置这些参数,可以帮助你更好地优化 Spark 应用程序的性能和资源利用率。具体的调优还需要根据实际的工作负载和集群资源情况进行测试和调整。

3.4)问题04:这样类似spark.default.parallelism的配置参数还有哪些?

Spark有许多配置参数可以用来优化和调整集群和应用程序的性能。以下是一些常用的配置参数,类似于spark.default.parallelism,它们可以帮助你优化Spark作业的执行:

  1. spark.executor.memory:每个executor的内存大小,例如spark.executor.memory=4g

  2. spark.executor.cores:每个executor使用的CPU核心数,例如spark.executor.cores=2

  3. spark.driver.memory:Driver程序的内存大小,例如spark.driver.memory=2g

  4. spark.driver.cores:Driver程序使用的CPU核心数,例如spark.driver.cores=1

  5. spark.task.cpus:每个task使用的CPU核心数,例如spark.task.cpus=1

  6. spark.sql.shuffle.partitions:SQL查询中shuffle操作的分区数,例如spark.sql.shuffle.partitions=200

  7. spark.storage.memoryFraction:用于存储RDD持久化数据的内存比例(已被spark.memory.fraction替代)。

  8. spark.memory.fraction:用于执行和存储的内存比例,例如spark.memory.fraction=0.6

  9. spark.memory.storageFraction:存储内存的比例,例如spark.memory.storageFraction=0.5

  10. spark.local.dir:Spark本地临时目录,例如spark.local.dir=/tmp/spark.

  11. spark.network.timeout:网络超时时间,例如spark.network.timeout=120s

  12. spark.shuffle.compress:是否压缩shuffle数据,例如spark.shuffle.compress=true

  13. spark.rdd.compress:是否压缩RDD序列化数据,例如spark.rdd.compress=true

  14. spark.speculation:是否启用task推测执行,例如spark.speculation=true

  15. spark.sql.autoBroadcastJoinThreshold:自动广播的小表的最大大小,例如spark.sql.autoBroadcastJoinThreshold=10MB

这些配置参数可以在提交Spark应用时通过--conf选项进行设置,也可以在Spark应用的代码中通过sparkConf对象进行设置。例如:

val sparkConf = new SparkConf().setAppName("MyApp").set("spark.executor.memory", "4g").set("spark.executor.cores", "2").set("spark.sql.shuffle.partitions", "200")

调整这些参数可以帮助你更好地利用集群资源,提高Spark作业的性能。

3.5)问题05:怎么把已经得到的spark的事件日志json文件导入并在 spark webUI中解析并可视化展示?

要将已经得到的 Spark 事件日志 JSON 文件导入并在 Spark Web UI 中解析和可视化展示,可以按照以下步骤操作:

前提条件

  1. Spark安装:确保你已经安装并配置好了 Apache Spark。
  2. 事件日志文件:你已经有了一个或多个 Spark 事件日志 JSON 文件。

步骤

  1. 配置Spark来读取事件日志文件

    首先,你需要在 spark-defaults.conf 文件中配置 Spark 事件日志的路径。这个文件通常位于 $SPARK_HOME/conf/ 目录下。

    添加以下配置(假设事件日志文件存放在 /path/to/eventlog 目录中):

    spark.eventLog.enabled           true
    spark.eventLog.dir               file:/path/to/eventlog
    
  2. 启动Spark History Server

    Spark History Server 是用于查看和分析 Spark 应用程序历史记录的组件。启动它可以通过以下命令:

    $SPARK_HOME/sbin/start-history-server.sh
    
  3. 验证Spark History Server是否启动

    启动后,你可以在浏览器中访问 History Server 的 Web UI,默认地址是 http://localhost:18080。你应该能够在这个页面上看到已经解析的事件日志文件和相应的应用程序。

详细步骤解释

  1. 配置事件日志路径

    • 打开 $SPARK_HOME/conf/spark-defaults.conf 文件,如果没有这个文件,可以复制模板文件:
      cp $SPARK_HOME/conf/spark-defaults.conf.template $SPARK_HOME/conf/spark-defaults.conf
      
    • 编辑 spark-defaults.conf 文件,添加或修改以下配置:
      spark.eventLog.enabled           true
      spark.eventLog.dir               file:/path/to/eventlog
      
  2. 启动History Server

    • 运行以下命令启动 History Server:
      $SPARK_HOME/sbin/start-history-server.sh
      
  3. 访问History Server

    • 打开浏览器,访问 http://localhost:18080,你应该能够看到解析后的事件日志和应用程序历史记录。

注意事项

  • 事件日志文件路径:确保事件日志文件路径正确且文件有适当的读权限。
  • 端口冲突:如果端口 18080 被占用,可以修改配置文件 $SPARK_HOME/sbin/start-history-server.sh 来更改端口号。
  • 文件格式:确保事件日志文件是 JSON 格式,且符合 Spark 的事件日志格式要求。

通过以上步骤,你应该能够成功将 Spark 事件日志文件导入并在 Spark Web UI 中解析和可视化展示。如果有任何问题,可以查看 Spark 的日志文件以获取更多调试信息。

相关文章:

技术周总结 2024.07.15~07.21周日(Spark性能优化)

文章目录 一、07.19 周五1.1&#xff09;问题01&#xff1a; spark性能优化1.2&#xff09;问题02&#xff1a; spark是怎么应用在机器学习领域的1.3&#xff09;问题03&#xff1a;spark自带工具有哪些&#xff1f;1.4&#xff09;问题04&#xff1a; spark日志的知识点有哪些…...

提高性能的常见技术

1.数据库层面&#xff1a; 读写分离&#xff0c;对于大部分业务来说&#xff0c;读取操作要大于写入&#xff0c;同一个库&#xff0c;既读又写的话&#xff0c;负载会比较重&#xff0c;拆分为读库和写入库&#xff0c;可以降低数据库的负载&#xff0c;分时或延迟将写入的数…...

LeetCode206 反转链表

前言 题目&#xff1a; 206. 反转链表 文档&#xff1a; 代码随想录——反转链表 编程语言&#xff1a; C 解题状态&#xff1a; 有了思路以后没敢尝试 思路 需要注意的是创建指针不会申请额外的内存空间。 代码 方法一&#xff1a; 双指针法/迭代 我的理解是创建了三个指针…...

nginx通过nginx_upstream_check_module实现后端健康检查

1、简介说明 nginx是常用的反向代理和负载均衡服务&#xff0c;具有强大并发能力、稳定性、丰富的功能集、低资源的消耗。 nginx自身是没有针对后端节点健康检查的&#xff0c;但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完…...

FastGPT 知识库搜索测试功能解析(二)

目录 一、代码解析 1.1 searchTest.ts 1.2 controller.ts 本文接上一篇文章FastGPT 知识库搜索测试功能解析 对具体代码进行解析。 一、代码解析 FastGPT 知识库的搜索测试功能主要涉及两个文件,分别是 searchTest.ts 和 controller.ts 文件,下面分别进行介绍。 1.1 se…...

双向链表<数据结构 C版>

目录 关于链表的分类 双向链表结构体 初始化 尾插 头插 打印 判断是否为空 尾删 头删 查找 指定位置之后的插入 指定位置的删除 销毁 关于链表的分类 根据链表的三大特性&#xff0c;单向or双向、带头or不带头、循环or不循环&#xff0c;可将链表分为2*2*2&#xf…...

react18+

主要是围绕函数式组件讲&#xff0c;18主要用就是函数式组件&#xff0c;学习前先熟悉下原生js的基本使用&#xff0c;主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则&#xff0c;只是放在一个方法里面返回而已&#xff0c;我们称这样的写法为函数式组件…...

rk3568 OpenHarmony4.1 Launcher定制开发—桌面壁纸替换

Launcher 作为系统人机交互的首要入口&#xff0c;提供应用图标的显示、点击启动、卸载应用&#xff0c;并提供桌面布局设置以及最近任务管理等功能。本文将介绍如何使用Deveco Studio进行单独launcher定制开发、然后编译并下载到开发板&#xff0c;以通过Launcher修改桌面背景…...

MySQL:送分or送命 varchar(30) 与 int(10)

摘要&#xff1a; VARCHAR(30) 和 INT(10) 在MySQL中代表两种不同类型的字段&#xff0c;它们之间的主要区别在于它们存储的数据类型、存储方式以及显示宽度的含义。 正文&#xff1a; INT(10) 在MySQL中&#xff0c;当你看到INT(10)这样的数据类型定义时&#xff0c;可能会…...

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中&#xff0c;有介绍过前端触发的通知服务。 【odoo】右上角的提示&#xff08;通知服务&#xff09; 此文章则介绍后端触发方法。 内容 直接上代码&#xff1a;但是前提一定是按钮触发&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; def bu…...

1775D - Friendly Spiders

题目链接&#xff1a;Friendly Spiders 首先我们可以考虑暴力做法&#xff0c;那就是每两个蜘蛛判断一下gcd&#xff0c;如果不等于1&#xff0c;那就连条边&#xff0c;这样的话时间复杂度是O&#xff08;n^2&#xff09;&#xff0c;显然超时&#xff0c;因此我们可以采用类似…...

【python】OpenCV—Point Polygon Test

文章目录 1、完整代码2、涉及到的库cv2.pointPolygonTestcv2.minMaxLoc 1、完整代码 from __future__ import print_function from __future__ import division import cv2 as cv import numpy as np # Create an image r 100 src np.zeros((4*r, 4*r), dtypenp.uint8) # 创…...

6 Go语言的常量、枚举、作用域

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;由浅入深讲解Go语言&#xff0c;希望大家都能够从中有所收获&#xff0c;也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;大家一起学习&#xff0c;…...

第十一章 数据结构

第十一章 数据结构 11.1 数组 数组是元素的顺序集合&#xff0c;通常这些元素具有相同的数据类型 索引表示元素在数组中的顺序号&#xff0c;顺序号从数组开始处计数 数组元素通过索引被独立给出了地址&#xff0c;数组整体上有一个名称&#xff0c;但每个元素利用数组的的…...

LeetCode704 二分查找

前言 题目&#xff1a; 704.二分查找 文档&#xff1a; 代码随想录——二分查找 编程语言&#xff1a; C 解题状态&#xff1a; 解答错误&#xff0c;变量定义位置错误。 思路 有序数组的查找&#xff0c;最直接的思路应该就是二分查找。但是在查找的过程中要考虑到区间的边界…...

[言简意赅] Matlab生成FPGA端rom初始化文件.coe

&#x1f38e;Matlab生成FPGA端rom初始化文件.coe 本文主打言简意赅。 函数源码 function gencoeInitialROM(width, depth, signal, filepath)% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件%% 输入参数:% width - ROM 数据位宽% depth - ROM 数据深度% s…...

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…...

从等保测评看行业安全趋势:洞察与预测

在当今数字化时代&#xff0c;网络安全已成为各行各业的头等大事。等保测评&#xff08;等级保护测评&#xff09;&#xff0c;作为国家对信息系统安全的重要管理手段&#xff0c;不仅关乎企业的合规性&#xff0c;更是行业安全水平的重要衡量标准。本文将从等保测评的视角出发…...

HTTP模块(二)

HTTP 设置 HTTP 响应报文 HTTP报文常见属性&#xff1a; const http require(http);const server http.createServer((request, response) > {// 设置请求状态码 2xx 4xx 5xxresponse.statusCode 200;// 设置请求描述 了解即可response.statusMessage hello// 指定响…...

引入缓存带来的问题以及解决方案

目录 前言 问题与解决方案 缓存击穿 缓存穿透 缓存雪崩 缓存一致性 前言 在提升接口性能的方案中&#xff0c;毫无疑问&#xff0c;使用缓存是最有效果的&#xff0c;但同时也会带来新的问题。 缓存击穿缓存穿透缓存雪崩缓存一致性 以上问题都是引入缓存需要考虑的&am…...

力扣39题:组合总和的 Java 实现

引言 力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;提供了大量的编程题目供开发者练习。第39题“组合总和”是一个经典的回溯算法问题&#xff0c;要求找出所有可能的组合&#xff0c;使得组合中的数字之和等于给定的目标值。本文将介绍如何使用 Java …...

使用el-table实现自动滚动

文章目录 概要技术实现完整代码 概要 在前端开发大屏的时候&#xff0c;我们会用到表格数据展示&#xff0c;有时候为了使用户体验更加好&#xff0c;会增加表格自动滚动。下边我将以示例代码&#xff0c;用element UI的el-table来讲一下。 技术实现 1 .增加dom监听&#xf…...

Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题

互联网产品离不开数据处理&#xff0c;数据处理有一些基本的原则包括&#xff1a;准确性、‌完整性、‌一致性、‌保密性、‌及时性。‌ 准确性&#xff1a;是数据处理的首要目标&#xff0c;‌确保数据的真实性和可靠性。‌准确的数据是进行分析和决策的基础&#xff0c;‌因此…...

day13(DNS域名解析)

今天内容&#xff1a; 1、逆向解析 2、多域名 3、时间服务器 4、主从配置 1.设置逆向解析 &#xff08;1&#xff09;永久配置我们自己的DNS服务器 &#xff08;2&#xff09;关闭NetworkManager服务 NetworkManager 的自动管理功能可能会干扰定制化的网络配置。 在需要切换…...

uboot的mmc partconf命令

文章目录 命令格式参数解释具体命令解释总结 mmc partconf 是一个用于配置 MMC (MultiMediaCard) 分区的 U-Boot 命令。具体来说&#xff0c;这个命令允许你设置或读取 MMC 卡的分区配置参数。让我们详细解释一下 mmc partconf 0 0 1 0 命令的含义。 命令格式 mmc partconf &…...

数据结构经典测题3

1. 设有定义&#xff1a; char *p; &#xff0c;以下选项中不能正确将字符串赋值给字符型指针 p 的语句是【多选】&#xff08; &#xff09; A: pgetchar(); B: scanf("%s",p); C: char s[]"china"; ps; D: *p"china"; 答案为ABD A选项&…...

tensorboard add_text() 停止自动为尖括号标记添加配对的结束括号</>

问题 调用tensorboard的add_text()记录文本信息时&#xff0c;如果文本中含有含尖括号的标记&#xff0c;就会被自动识别为html标记&#xff0c;因此tensorboard会自动生成对应的带斜杠的结束标记。 例如要记录的文本是 abc<abc>&#xff0c;在tensorboard中就会显示为a…...

sql-libs通关详解

1-4关 1.第一关 我们输入?id1 看回显&#xff0c;通过回显来判断是否存在注入&#xff0c;以及用什么方式进行注入&#xff0c;直接上图 可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显&#xff0c;所以我们可以使用联合查询。联合查询原理简单说一下&…...

【STM32】当按键具有上拉电阻时GPIO应该配置什么模式?怎么用按键去控制LED翻转?

当按键具有上拉电阻时&#xff0c;可以通过正确配置STM32的GPIO端口和编写相应的控制代码来实现按键控制LED灯的功能。具体来说&#xff0c;需要配置按键所连接的GPIO端口为输入模式&#xff0c;并启用内部上拉电阻&#xff0c;这样在按键未操作时该端口保持高电平状态&#xf…...

EXO-chatgpt_api 解释

目录 chatgpt_api 解释 resolve_tinygrad_tokenizer 函数 resolve_tokenizer 函数 调试和日志记录​​​​​​​ 参数 返回值 初始化方法 __init__ 异步方法 注意事项 chatgpt_api 解释 展示了如何在一个项目中组织和导入各种库、模块和类,以及如何进行一些基本的We…...

新能源汽车的充电网络安全威胁和防护措施

1. 物理攻击&#xff1a;例如恶意破坏、搬走充电设施等&#xff0c;这可能会对充电设施造成损害&#xff0c;妨碍正常的电力传输。 2. 网络攻击&#xff1a; 黑客可能利用系统漏洞攻击网络&#xff0c;破坏设备&#xff0c;并窃取用户的个人信息、支付信息等&#xff1b; 车辆…...

Linux中利用消息队列给两个程序切换显示到前台

消息队列–两个进程间的通信 需求&#xff1a; 1.在Linux系统中2.两个ui界面的程序切换&#xff0c;一个显示&#xff0c;另一个隐藏 .h #ifndef PROGRAMWINDOWSWITCH2_H #define PROGRAMWINDOWSWITCH2_H#include <QObject> #include <QThread> #include <Q…...

C语言实例-约瑟夫生者死者小游戏

问题&#xff1a; 30个人在一条船上&#xff0c;超载&#xff0c;需要15人下船。于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数&#xff0c;从1开始&#xff0c;数到9的人下船&#xff0c;如此循环&#xff0c;直到船上仅剩15人为止&#xff0c;问都有哪些编号…...

算法类学习笔记 ———— 红绿灯检测

文章目录 介绍基于传统视觉方法的检测基于颜色和边缘信息基于背景抑制 基于深度学习的检测特征金字塔网络&#xff08;FPN&#xff09;红绿灯检测特征金字塔自下而上自上而下横向连接 特征融合SSD红绿灯检测 高精度地图结合 介绍 红绿灯检测就是获取红绿灯在图像中的坐标以及它…...

git命令使用详细介绍

1 环境配置 设置的信息会保存在~/.gitconfig文件中 查看配置信息 git config --list git config user.name设置用户信息 git config --global user.name "有勇气的牛排" git config --global user.email “1809296387qq.com”2 获取Git仓库 2.1 本地初始化一个仓…...

WebStorm中在Terminal终端运行脚本时报错无法加载文件进行数字签名。无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅

错误再现 我们今天要 在webstorm用终端运行脚本 目的是下一个openAPI的 前端请求代码生成的模块 我们首先从github上查看官方文档 我们根据文档修改 放到webstorm终端里执行 报错 openapi : 无法加载文件 C:\Users\ZDY\Desktop\多多oj\dduoj\node_modules\.bin\openapi.p…...

【Java题解】以二进制加法的方式来计算两个内容为二进制数字的字符串相加的结果

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; &#x1f451;目录 分析&#xff1a;&#x1f680; 数字层面分析⭐ 字符串层面分析⭐ 代码及运行结果分析:&#x1f6…...

docker -v 到底和那个一样?type=volume还是type=bind的解释

逐行通俗详细的解释下这个代码“#!/usr/bin/env bash # # This script will automatically pull docker image from DockerHub, and start a daemon container to run the Qwen-Chat web-demo.IMAGE_NAMEqwenllm/qwen:2-cu121 QWEN_CHECKPOINT_PATH/path/to/Qwen-Instruct PORT…...

linux自动化构建工具--make/makefile

目录 1.make/makefile介绍 1.1基本认识 1.2依赖关系、依赖方法 1.3具体操作步骤 1.4进一步理解 1.5默认设置 1.6make二次使用的解释 1.7两个文件的时间问题 1.8总是被执行 1.9特殊符号介绍 1.make/makefile介绍 1.1基本认识 make是一个指令&#xff0c;makefile是一…...

学习记录——day15 数据结构 链表

链表的引入 顺序表的优缺点 1、优点:能够直接通过下标进行定位元素&#xff0c;访问效率高&#xff0c;对元素进行查找和修改比较快 2、不足:插入和删除元素需要移动大量的元素&#xff0c;效率较低 3、缺点:存储数据元素有上限&#xff0c;当达到MAX后&#xff0c;就不能再…...

vue3实现在新标签中打开指定的网址

有一个文件列表&#xff0c;如下图&#xff1a; 我希望点击查看按钮的时候&#xff0c;能够在新的标签页面打开这个文件的地址进行预览&#xff0c;该如何实现呢&#xff1f; 比如&#xff1a; 实际上要实现这个并不难&#xff0c;参考demo如下&#xff1a; 首先&#x…...

Qt基础 | QSqlTableModel 的使用

文章目录 一、QSqlTableModel 的使用1.主窗口MainWindow类定义2.构造函数3.打开数据表3.1 添加 SQLite 数据库驱动、设置数据库名称、打开数据库3.2 数据模型设置、选择模型、自定义代理组件、界面组件与模型数据字段间的数据映射 4.添加、插入与删除记录5.保存与取消修改6.设置…...

RPA软件-影刀使用

流程自动化 影刀将操作进行抽象&#xff0c;分为一下几个对象&#xff1a; 网页自动化 &#xff08;1&#xff09; 网页自动化应用场景&#xff1a;网页操作、数据抓取 &#xff08;2&#xff09; 网页操作&#xff1a;基础操作-指令操作&#xff0c;智能操作-关联元素&#…...

HarmonyOS NEXT零基础入门到实战-第四部分

自定义组件: 概念: 由框架直接提供的称为 系统组件&#xff0c; 由开发者定义的称为 自定义组件。 源代码&#xff1a; Component struct MyCom { build() { Column() { Text(我是一个自定义组件) } } } Component struct MyHeader { build() { Row(…...

vue2获取视频时长

使用HTML5的video标签和JavaScript&#xff1a; <template><video ref"video" autoplay controls loop muted loadedmetadata"getVideoDuration"><source src"https://desktop-yikao.oss-cn-beijing.aliyuncs.com/avatar/kaissp.mp4&q…...

Linux中进程的控制

一、进程的创建 1、知识储备 进程的创建要调用系统接口&#xff0c;头文件 #include<unistd.h> 函数fork() 由于之前的铺垫我们现在可以更新一个概念 进程 内核数据结构&#xff08;task_struct, mm_struct, 页表....&#xff09; 代码 数据 所以如何理解进程的独…...

【源码】Sharding-JDBC源码分析之JDBC

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

Java | Leetcode Java题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…...

数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)

文章目录 一、简单选择排序原理二、C/C代码实现总结&#xff1a; 在计算机科学中&#xff0c;排序算法是一种非常基础且重要的算法。简单选择排序&#xff08;Selection Sort&#xff09;作为其中的一种&#xff0c;因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…...

使用vscode搜索打开的文件夹下的文件

右键空白处打开命令面板 摁一次删除键&#xff0c;删除掉图中的大于号 这样就能够找到例化的模块&#xff0c;文件具体在哪个位置&#xff0c;然后打开了...