spark-submit --jars pseudo cluster 的jar依赖准备

一键解决Spark依赖

本地hadoop环境提交job时经常碰到一大堆依赖需要引入的问题,又不想全部把依赖打包到代码里发布,比较好的选择则是 spark-submit --jar 选项。jar比较少的时候手动复制黏贴方式比较方便,jar依赖比较多时就很麻烦。于是想弄个脚本一步搞定,就有了下面的代码:

 

1. build.gradle里添加任务 sparkJars

/**
 * write spark --jar files into a file to use when spark-submitting.
 */
task sparkJars () {
    def jarsFile = new File(System.getProperty("user.home"), "sparkJars.txt")

    System.out.println("sparkJarsFile: " + jarsFile.absolutePath)

    if (jarsFile.exists()){
        jarsFile.delete()
    }

    def printWriter = jarsFile.newPrintWriter()

    configurations.default.collect {
        // skip lombok
        if (it.isFile() && ! it.name.contains("lombok")) {
            printWriter.println(it.absolutePath)
        }
    }

    printWriter.close()
} 

把本地文件的绝对路径写到/home/user/sparkJars.txt文件中。

 

2. 编写脚本submit-job.sh

#!/bin/sh

# write dependency jar path into sparkJar file
`../gradlew sparkJars`

CLASS_PATH=""
# create spark class path
for jar in `cat ~/sparkJars.txt`; do
CLASS_PATH="$CLASS_PATH","$jar";
done

MAIN_CLASS="com.my.detection.OrderDetectionStreaming"
JAVA_CMD="spark-submit --master yarn  --deploy-mode cluster --class $MAIN_CLASS  --jars $CLASS_PATH --conf 'spark.driver.extraJavaOptions=-Dspring.profiles.active=develop' --conf 'spark.executor.extraJavaOptions=-Dspring.profiles.active=develop' build/libs/rule-engine-0.0.1-SNAPSHOT.jar"
echo $JAVA_CMD
eval $JAVA_CMD

 

这里的脚本就是把sparkJars.txt里的内容用个逗号拼接起来,然后在spark-submit --jar 方式提交到spark driver 上。这样依赖就可以冲driver上分发下去,直接运行程序了。

 

<think> 我们正在讨论如何使用spark-submit运行jar包中的指定类。根据引用[1]和引用[2],我们可以通过--class参数来指定要运行的主类。同时,我们也可以在主类后面传递程序参数。 步骤: 1. 确保你已经构建了包含指定类的jar包,并且该类有一个main方法作为入口点。 2. 使用spark-submit命令,通过--class选项指定完整类名(包括包名),然后指定jar包的路径,最后可以传递程序参数。 命令格式: ```bash spark-submit \ --class <full-class-name> \ [其他spark配置选项] \ /path/to/your-jar.jar \ [应用程序参数] ``` 示例: 假设我们有一个包名为com.example,类名为MySparkApp,jar包名为my-spark-app.jar,并且需要传递两个参数arg1和arg2,那么命令如下: ```bash spark-submit \ --class com.example.MySparkApp \ --master yarn \ --deploy-mode client \ --executor-memory 4G \ my-spark-app.jar \ arg1 arg2 ``` 注意: - `--class` 参数后跟的是完整类名(全限定名)。 - jar包路径放在类名之后,应用程序参数之前。 -jar包之后的参数会被传递给main函数的args数组。 引用[1]中的例子: ```bash bin/spark-submit --class full.package.name.ClassName 1234 someargument someArgument analytics-package.jar ``` 这里需要注意的是,这个例子中传递的参数放在了jar包之前,这可能是错误的。根据Spark官方文档,应用程序参数应该在jar包之后。所以正确的应该是: ```bash bin/spark-submit --class full.package.name.ClassName analytics-package.jar 1234 someargument someArgument ``` 引用[2]的例子是正确的: ```bash ./bin/spark-submit \ --class com.test.examples.SparkStreaming \ ... # 其他spark配置 /path/to/examples.jar \ /path/to/application.properties # 这个参数会传递给main函数 ``` 因此,请确保将jar包放在--class之后,应用程序参数之前。 另外,如果遇到类路径问题,可以如引用[3]所示,使用`--conf`设置`spark.driver.userClassPathFirst=true`来优先使用用户提供的依赖。 总结: 运行jar包中指定类的步骤: 1. 使用`--class`指定完整类名。 2. 在命令中指定jar包的位置。 3. 在jar包之后添加应用程序需要的参数。 相关问题: 1. 如何在spark-submit中设置Spark配置参数(如executor内存)? 2. 当运行Spark应用时,如何避免依赖冲突(比如不同的日志框架)? 3. 如何调试spark-submit提交应用时的类找不到问题? 4. 如何为Spark应用传递配置文件(如properties文件)? </think> ### 如何使用`spark-submit`运行JAR包中的指定类 通过`spark-submit`运行JAR中的指定类时,核心是使用`--class`参数指定**完整类名**(全限定类名)。以下是具体操作步骤: #### 1. 基本命令格式 ```bash spark-submit \ --class <完整类名> \ # 关键参数:指定主类 <Spark配置参数> \ # 可选:集群资源配置 /path/to/your-app.jar \ # JAR包路径 <程序参数> # 可选:传递给main()的参数 ``` #### 2. 完整示例 假设有以下项目结构: ``` com.example └── SparkApp.class # 完整类名:com.example.SparkApp ``` 运行命令: ```bash spark-submit \ --class com.example.SparkApp \ # 指定全限定类名 --master yarn \ # 集群模式 --deploy-mode client \ # 部署模式 --executor-memory 4g \ # 执行器内存 /opt/spark/jobs/my-spark-app.jar \ # JAR路径 input.csv output/ # 传递给main()的参数[^1][^2] ``` #### 3. 关键参数说明 | 参数 | 作用 | 是否必需 | |------|------|----------| | `--class` | 指定全限定类名(包名+类名) | **必需** | | `--master` | 指定集群管理器(yarn/mesos/local等) | 可选 | | `--deploy-mode` | 部署模式(client/cluster) | 可选 | | JAR路径 | 应用程序JAR的完整路径 | **必需** | | 程序参数 | 传递给`main()`方法的参数 | 可选 | #### 4. 常见问题解决 **问题:类找不到(ClassNotFoundException)** - ✅ 检查类名拼写:包名+类名必须完全匹配 - ✅ 确认JAR包包含该类:`jar tf my-spark-app.jar | grep SparkApp` - ✅ 添加依赖JAR:`--jars lib1.jar,lib2.jar` **问题:日志配置冲突** ```bash # 优先使用用户提供的日志配置 spark-submit --conf "spark.driver.userClassPathFirst=true" ... ``` **问题:YARN资源抢占** ```bash # 增加资源申请避免抢占 spark-submit --executor-memory 8g --num-executors 10 ... ``` #### 5. 最佳实践建议 1. **类命名规范**: ```java // 推荐:清晰的包结构 package com.company.project.spark; public class DataProcessor { ... } ``` 2. **参数传递方式**: ```bash # 配置文件方式(推荐) spark-submit ... my-app.jar config.properties # 命令行参数方式 spark-submit ... my-app.jar --input=hdfs:///data --output=/results ``` 3. **依赖管理**: ```bash # 传递额外依赖spark-submit --jars mysql-connector.jar,guava.jar ... ``` [^1][^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值