Spark2.1.1<性能调优Spark运行时jar从yarn端访问>

1.为什么要让运行时Jar可以从yarn端访问

spark2以后,原有lib目录下的大JAR包被分散成多个小JAR包,原来的spark-assembly-*.jar已经不存在

每一次我们运行的时候,如果没有指定
spark.yarn.archive or spark.yarn.jars
Spark将在安装路径下的Jar目录,将其所有的Jar包打包然后将其上传到分布式缓存(官网上的原话是:To make Spark runtime jars accessible from YARN side, you can specify spark.yarn.archive or spark.yarn.jars. For details please refer to Spark Properties. If neither spark.yarn.archive nor spark.yarn.jars is specified, Spark will create a zip file with all jars under $SPARK_HOME/jars and upload it to the distributed cache.

这里以简单地写了一个wordcount.scala为例,将其打包然后部署到Spark集群上运行

object WordCount {
  def main(args: Array[String]): Unit = {
    if (args.length != 2)
      println("AppName  +   FilePath")
    val conf = new SparkConf()
      //      .setMaster("local[4]")
      .setAppName(args(0))
    val sc = new SparkContext(conf)
    val lines = sc.textFile(args(1))
    val flatRDD = lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect.foreach(println)
  }
}

观察日志:
这里写图片描述

yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.

大致的意思说找不到spark.yarn.jars nor spark.yarn.archive,回到spark安装目录上传运行时的Jar包

观察一下SparkUI,这里以collect为例子

这里写图片描述

点进去。观察他的Scheduler Delay
这里写图片描述

可以看到Scheduler Delay=557-457=100

2.调优办法

  • 首先将Spark安装路径下的所有jar包上传到HDFS上,我是上传到了/system/sparkJar/jars
    这里写图片描述
  • 接着在spark的conf目录下的spark-defaults.conf末尾添加上这一行
spark.yarn.jars hdfs://172.17.11.85:9000/system/sparkJar/jars/*.jar 

这里写图片描述

3.调优之后与调优之前的对比

  • 调优之后日志变化:
    这里写图片描述

可以看到它已经不用上传Spark运行时Jar包到分布式缓存中了

  • 看看UI

还是相同的界面:

这里写图片描述

还是看Scheduler Delay

发现Scheduler Delay=313-263=50

与调优之前时间整整缩短了一半,Scheduler Delay从100缩短到了50

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>untitled</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>first</module> <module>spring5-ioc-xml</module> <module>spring5-ioc-annotation</module> <module>spring5-reflect</module> <module>atguigu-spring</module> <module>spring6-aop</module> <module>spring6-jdbc-tx</module> </modules> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>6.0.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>6.0.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.2</version> </dependency> <dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifa
最新发布
04-03
<think>好的,用户想了解如何在Maven的POM文件中配置Spring项目的依赖管理。首先,我需要回忆Maven中的dependencyManagement的作用。根据引用[2],dependencyManagement用于统一管理依赖版本和范围,子模块继承可以不用指定版本号。而引用[3]提到可以通过<scope>import</scope>来聚合多个pom的dependencyManagement,这可能在Spring Boot项目中用到。 接下来,用户需要具体的例子,可能需要展示一个典型的Spring Boot项目的父POM配置。通常Spring Boot项目会使用spring-boot-starter-parent作为父项目,或者通过dependencyManagement引入Spring Boot的BOM(Bill of Materials)。比如,在父POM的dependencyManagement中导入spring-boot-dependencies,这样所有子模块的Spring依赖就可以省略版本号。 然后,用户可能想知道如何管理不同模块的依赖,比如web、data-jpa等。需要展示如何在子模块的dependencies中添加starter依赖,比如spring-boot-starter-web,并说明由于父POM的dependencyManagement,这里不需要写版本。 另外,引用[1]提到dependencies标签用于管理依赖,而dependencyManagement是集中管理版本。需要区分两者的不同,确保用户理解何使用哪个部分。 还要注意是否需要处理多模块项目,引用[3]提到的聚合工程可能需要使用import scope来合并多个依赖管理,这在复杂项目中可能会有用。例如,如果项目同需要Spring Cloud的依赖管理,可以通过import scope引入。 最后,确保提供的示例代码正确,符合Maven语法,并且注释清晰。同,生成的相关问题需要涵盖用户可能进一步询问的内容,比如版本冲突解决、多模块配置等。</think>### Maven项目配置及Spring依赖管理示例 在Maven中管理Spring依赖,通常结合`<dependencyManagement>`实现版本统一控制。以下是典型配置步骤: --- #### 1. **父POM中定义Spring Boot依赖管理** 通过`<dependencyManagement>`导入Spring Boot官方提供的BOM(Bill of Materials),自动管理所有Spring Boot相关依赖的版本: ```xml <project> <dependencyManagement> <dependencies> <!-- 引入Spring Boot官方BOM --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project> ``` - `<scope>import</scope>`表示继承目标POM中定义的依赖管理规则[^3] - 子模块中引用Spring依赖**无需指定版本号** --- #### 2. **子模块添加具体依赖** 在需要Spring功能的模块中,直接声明starter依赖: ```xml <dependencies> <!-- Web模块 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 数据访问模块 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> ``` --- #### 3. **多模块依赖管理(可选)** 对于需要合并多个BOM的复杂项目: ```xml <dependencyManagement> <dependencies> <!-- 同引入Spring Cloud和Spring Boot的BOM --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2022.0.1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` - 多个BOM的依赖版本会根据声明顺序合并 --- #### 4. **依赖范围控制示例** 通过`<scope>`定义依赖作用域: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` - `test`表示该依赖仅在测试阶段有效[^2] --- ### 关键概念对比 | 配置项 | 作用域 | 特点 | |---------------------|----------------|----------------------------------------------------------------------| | `<dependencies>` | 当前模块 | 直接引入依赖,版本号必须显式声明 | | `<dependencyManagement>` | 全局管理 | 仅定义版本和范围,子模块引用可省略版本号[^2] |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值