如何添加多个jar到spark-submit的classpath?

当使用Spark -submit提交Spark应用程序时,经常需要在类路径中包含多个第三方jar, Spark支持多种方式向类路径中添加依赖jar。

1. 将jar添加到classpath

可以使用spark-submit、spark-defaults.conf和SparkConf属性将多个第三方jar添加到类路径中,在使用这些选项之前,您需要了解这些选项如何应用的优先级。下面是它们按顺序应用的优先级。

  1. 直接在SparkConf上设置的属性优先级最高。

  2. 第二个优先级是spark-submit选项。

  3. 最后,spark-defaults.conf文件中指定的属性。

当您在不同的地方设置jars时,请记住它的优先级。使用带有--verbose选项的spark-submit可以获得关于spark 使用jars的更多细节

1.1. Adding jars to the classpath

可以使用Spark submit选项--jar添加jar,使用此选项您可以添加单个jar或多个以逗号分隔的jar。

示例:# yarn cluster提交

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 1g  --executor-cores 1  --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j-driver.xml" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.xml" --files=/opt/test/conf/log4j-driver.xml,/opt/test/conf/log4j-executor.xml --jars "/opt/test/slf4j-api-1.7.25.jar" spark-examples_2.11-2.4.7.jar 10

必要条件:运行spark-submit命令的机器上必须存在对应的jar

或者,你也可以使用SparkContext.addJar()

1.2. Adding all jars from a folder to classpath

如果你有很多jar,想象一下用逗号分隔所有这些jar,当你必须更新jar的版本时,维护它将是一场噩梦。

$(echo /path/*.jar | tr ' ' ',')语句通过在文件夹中附加所有jar名称创建一个逗号分隔的字符串。

spark-submit -- class com.spark.examples.WordCountExample \ 
             --jars $(echo /path/*.jar | tr ' ' ',') \ 
             your-application.jar 

1.3. 通过spark-submit 参数 --packages

使用spark-submit提交命令的参数: --packages, 集群中服务需要该包的的时候,都是从给定的maven地址直接下载

示例:spark-shell --packages  mysql:mysql-connector-java:5.1.27 --repositories http://maven.aliyun.com/nexus/content/groups/public/

必要条件:

nodeManager能访问maven地址

1.4. Adding jars with spark-defaults.conf

您也可以在$SPARK_HOME/conf/spark-defaults.conf上指定jar,但这不是一个更好的选择,并且您在这里指定的库优先级较低。

#Add jars to driver classpath
spark.driver.extraClassPath /path/first.jar:/path/second.jar
#Add jars to executor classpath
spark.executor.extraClassPath /path/first.jar:/path/second.jar

1.5. Using SparkConf properties

This takes the high priority among other configs.

spark = SparkSession \
        .builder \
        .appName("SparkExamples.com") \
        .config("spark.yarn.dist.jars", "/path/first.jar,/path/second.jar") \
        .getOrCreate()

2. 创建uber or assembly jar

通过包含应用程序类和所有第三方依赖项来创建assembly or uber jar。您可以使用Maven shade plugin或等效的 SBT assembly来实现这一点。

通过这样做,您不必担心将jar添加到类路径中,因为所有依赖项都已经是您的uber jar的一部分了。

maven-shade-plugin插件可以解决冲突双方的包互相不兼容情况,其原理是修改其中任意一方的依赖路径,来解决。比如package A依赖package org.apache.common_v1,package C依赖package org.apache.common_v2,此时可以将package B_v1重新打包成package shade.org.apache.common_V1,而后修改package A的所有包引入代码,import org.apache.common修改成import shade.org.apache.common

<build>
                <finalName>${project.name}-${project.version}</finalName>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-shade-plugin</artifactId>
                        <!-- <version>3.1.0</version>-->
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>shade</goal>
                                </goals>
                                <configuration>
 <!-- 指定程序入口 -->
                                    <transformers>
                                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>org.apache.learnspark.Main</mainClass>
                                        </transformer>
                                    </transformers>
<!--通过重命名解决jar冲突问题-->
                                    <relocations>
                                        <relocation>
                                            <pattern>com.google.protobuf</pattern>
                                            <shadedPattern>shaded.com.google.protobuf</shadedPattern>
                                        </relocation>
                                    </relocations>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>

3. Adding jars to Spark Driver

有时你可能需要只向Spark驱动添加一个jar,你可以使用--driver-class-path或--conf Spark .driver. extraclasspath来完成

spark-submit -- class com.sparkbyexamples.WordCountExample \ 
             --jars $(echo /path/jars/*.jar | tr ' ' ',') \ 
             --driver-class-path jar-driver.jar
             your-application.jar

4. 其它方式

--conf spark.driver.extraLibraryPath=/path/ 
# or use below, both do the same
--driver-library-path /path/

参考

https://sparkbyexamples.com/spark/add-multiple-jars-to-spark-submit-classpath/

http://spark.apache.org/docs/2.4.7/configuration.html

http://spark.apache.org/docs/2.4.7/running-on-yarn.html

### 使用 `spark-submit` 运行 Spark 应用程序 #### 提交应用程序至集群 为了在Spark集群上运行应用程序,可以利用位于Spark安装目录下的`spark-submit`脚本[^3]。此工具不仅简化了向不同类型的集群管理器提交作业的过程,还提供了通过一致的方式处理各种环境的需求。 #### 命令结构 基本命令格式如下所示: ```bash ./bin/spark-submit \ --class <main-class> \ --master <master-url> \ --deploy-mode <deploy-mode> \ --conf <key>=<value> \ ... # other options <application-jar> \ [application-arguments] ``` 其中, - `<main-class>` 是指定了包含`main()`函数的应用入口类名; - `<master-url>` 定义了要连接的Master节点URL(例如:local, spark://host:port, mesos://host:port, yarn等); - `<deploy-mode>` 可选参数指定部署模式为client或者cluster,默认是client模式,在这种情况下driver将在本地启动并由客户端进程控制;而在cluster模式下,则会在工作节点之一上创建一个新的JVM来作为Driver Program执行上下文; - `[application-arguments]` 表示传递给应用本身的额外参数列表。 #### 配置选项 除了上述必填项外,还可以设置一系列配置属性以优化性能或调整行为特性。这些可以通过`--conf key=value`的形式添加到命令行中去。比如内存分配、资源请求量以及日志级别等等都可以在此处定义。 #### 实际案例演示 假设有一个名为`example.jar`打包好的Scala/Java项目文件,并希望将其发送到YARN集群上去执行,那么完整的调用方式可能是这样的: ```bash $SPARK_HOME/bin/spark-submit \ --class org.example.MyApp \ --master yarn \ --deploy-mode cluster \ --executor-memory 2G \ --num-executors 50 \ example.jar arg1 arg2 ``` 这里设置了Executor使用的最大堆空间大小(`--executor-memory`)和期望获得的工作线程数量(`--num-executors`),同时也指明了两个自定义参数`arg1`, `arg2`. #### 工作流解析 当发出以上指令之后,将会触发一系列内部操作,包括但不限于构建必要的classpath、准备运行时环境变量、初始化ClassLoader实例化所需对象直至最终调用`runMain`方法完成整个过程[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

enjoy编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值