当应用程序 jar 在 hdfs 中时,Spark-submit 不起作用

Posted

技术标签:

【中文标题】当应用程序 jar 在 hdfs 中时,Spark-submit 不起作用【英文标题】:Spark-submit not working when application jar is in hdfs 【发布时间】:2015-04-28 16:03:46 【问题描述】:

我正在尝试使用 bin/spark-submit 运行 spark 应用程序。当我在本地文件系统中引用我的应用程序 jar 时,它可以工作。但是,当我将应用程序 jar 复制到 hdfs 中的目录时,出现以下异常:

警告:跳过远程 jar hdfs://localhost:9000/user/hdfs/jars/simple-project-1.0-SNAPSHOT.jar。 java.lang.ClassNotFoundException: com.example.SimpleApp

命令如下:

$ ./bin/spark-submit --class com.example.SimpleApp --master local hdfs://localhost:9000/user/hdfs/jars/simple-project-1.0-SNAPSHOT.jar

我使用的是 hadoop 2.6.0 版,spark 1.2.1 版

【问题讨论】:

你最终决定在这里做什么?您是否切换到 YARN 或找到其他解决方法?下面的 Sanjiv 指出了一个似乎与周边相关的错误。您是否尝试过 --deploy-mode cluster ?谢谢,有趣的错误,如果它真的是一个错误,并且似乎没有直接提交给 JIRA。也许检查this 【参考方案1】:

当我使用时,它对我有用的唯一方法

--master yarn-cluster

【讨论】:

如果他们不想使用 YARN 怎么办?我看到这是公认的答案,但 OP 试图使用本地 [*]?很有趣。 --master yarn-cluster 不适合我。以下是我的日志 sn-p:2018 年 4 月 11 日上午 9:22:20 org.apache.spark.launcher.OutputRedirector 重定向信息:master yarn-cluster 2018 年 4 月 11 日上午 9:22:20 org.apache。 spark.launcher.OutputRedirector 重定向信息:deployMode 集群 2018 年 4 月 11 日上午 9:22:20 org.apache.spark.launcher.OutputRedirector 重定向信息:警告:跳过远程 jar hdfs://locahlost/user/MyUser/Sample-1.0 .1Manish-SNAPSHOT.jar.【参考方案2】:

要使 spark-job 可以访问 HDFS 库,您必须在集群模式下运行作业。

$SPARK_HOME/bin/spark-submit \
--deploy-mode cluster \
--class <main_class> \
--master yarn-cluster \
hdfs://myhost:8020/user/root/myjar.jar

此外,还为客户端模式提出了 Spark JIRA,但尚不支持。

SPARK-10643 :支持客户端模式spark submit的HDFS应用下载

【讨论】:

对我的好回答应该被接受:) 但你没有显示集群模式,你正在显示纱线,你需要--deploy-mode cluster--master spark://yourmaster:7077 而不是--master yarn-cluster?如果 OP 说他正在使用 YARN,我就错过了,尽管我猜 HDFS 是一个很好的线索。我认为,如前所述,OP 正在尝试使用 Spark 作业管理器并在本地模式下查找错误?【参考方案3】:

有一个解决方法。您可以将 HDFS 中的目录(包含您的应用程序 jar)挂载为本地目录。

我也是这样做的(使用 azure blob 存储,但对于 HDFS 应该类似)

azure wasb 的示例命令

sudo mount -t cifs //storageAccountName.file.core.windows.net/directoryName local directory path -o vers=3.0,username=storageAccountName,password=storageAccountKey,dir_mode=0777,file_mode=0777

现在,在您的 spark 提交命令中,您提供上述命令的路径

$ ./bin/spark-submit --class com.example.SimpleApp --master local local directory path/simple-project-1.0-SNAPSHOT.jar

【讨论】:

【参考方案4】:

是的,它必须是本地文件。我想这就是答案。

【讨论】:

但是在official documentation 中,它指出:“application-jar:包含您的应用程序和所有依赖项的捆绑 jar 的路径。例如,该 URL 必须在集群内部全局可见, hdfs:// 路径 或 file:// 路径,所有节点上都存在。" @dlim 好点。这值得向 user@ 邮件列表提问。从略读代码看起来它只允许本地文件 谢谢。我现在试试邮件列表。 邮件列表上有答案吗? 如果您使用 Yarn 作为集群管理器,您在 spark 提交中使用了 --master yarn-cluster。

以上是关于当应用程序 jar 在 hdfs 中时,Spark-submit 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

通过spark sql 将 hdfs上文件导入到mongodb

Spark-on-YARN

Spark on yarn

spark-yarn 模式 jar包优化

spark 与 Hadoop 融合后 Neither spark.yarn.jars nor spark.yarn.archive is set

Spark 在yarn上运行模式详解:cluster模式和client模式