如何在spark-submit中使用存储在Artifactory中的JAR包?
可行解决方案
方案1:直接通过--jars拉取Artifactory JAR(适配你尝试1的场景)
你之前尝试--jars带URL凭证失败,是因为Spark拉取HTTP资源依赖Hadoop的HttpFileSystem,默认不识别URL中嵌入的username:password@格式认证信息,需要单独配置HTTP认证参数:
spark-submit \ # 配置Hadoop HTTP客户端基础认证 --conf spark.hadoop.fs.http.client.authentication.type=basic \ --conf spark.hadoop.fs.http.client.username=你的Artifactory用户名 \ --conf spark.hadoop.fs.http.client.password=你的Artifactory密码/API密钥 \ --jars https://你的JFrog端点/完整的JAR包路径 \ # 其余Spark配置、主类、应用参数等
如果担心命令行明文泄露凭证,可以把密码换成Artifactory账号生成的只读API密钥,也可以将上述两个Hadoop配置项写入集群的core-site.xml文件统一管理。
方案2:通过--packages + Maven配置拉取(适配你尝试2、3的场景)
这种方式适合拉取多个有依赖关系的JAR包,稳定性更高,步骤如下:
- 先在本地
~/.m2/settings.xml中配置Artifactory认证信息,避免把凭证写在命令行:
<settings> <servers> <server> <!-- id要和后续spark-submit指定的仓库标识对应 --> <id>artifactory-private</id> <username>你的Artifactory用户名</username> <password>你的Artifactory密码/API密钥</password> </server> </servers> </settings>
- 编写spark-submit命令:
spark-submit \ --packages 目标JAR的Maven坐标(格式为groupId:artifactId:版本号) \ --repositories https://你的JFrog端点/artifactory/对应Maven仓库名 \ # 其余Spark配置、主类、应用参数等
如果需要自定义Ivy规则,可额外加参数--conf spark.jars.ivySettings=/path/to/你的ivysettings.xml,注意要保证ivysettings中配置的仓库id和settings.xml中的server id完全一致,否则会出现认证失败伪装成404的问题。
常见问题排查
- 若返回路径解析错误,先确认Artifactory中JAR包的Maven坐标、仓库路径完全匹配你填写的参数,快照版本需要在仓库地址后缀加
snapshots标识 - 若仍提示NotFound,可开启Spark DEBUG日志查看实际请求的响应码,确认是路径问题还是认证问题
内容的提问来源于stack exchange,提问作者Mark Wan
相关产品推荐
相关产品推荐

