无法将本地JAR包提交到Spark集群:java.nio.file.NoSuchFileException。

6
~/spark/spark-2.1.1-bin-hadoop2.7/bin$ ./spark-submit --master spark://192.168.42.80:32141 --deploy-mode cluster file:///home/me/workspace/myproj/target/scala-2.11/myproj-assembly-0.1.0.jar

Running Spark using the REST application submission protocol.
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
17/06/20 16:41:30 INFO RestSubmissionClient: Submitting a request to launch an application in spark://192.168.42.80:32141.
17/06/20 16:41:31 INFO RestSubmissionClient: Submission successfully created as driver-20170620204130-0005. Polling submission state...
17/06/20 16:41:31 INFO RestSubmissionClient: Submitting a request for the status of submission driver-20170620204130-0005 in spark://192.168.42.80:32141.
17/06/20 16:41:31 INFO RestSubmissionClient: State of driver driver-20170620204130-0005 is now ERROR.
17/06/20 16:41:31 INFO RestSubmissionClient: Driver is running on worker worker-20170620203037-172.17.0.5-45429 at 172.17.0.5:45429.
17/06/20 16:41:31 ERROR RestSubmissionClient: Exception from the cluster:
java.nio.file.NoSuchFileException: /home/me/workspace/myproj/target/scala-2.11/myproj-assembly-0.1.0.jar
    sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
    sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    sun.nio.fs.UnixCopyFile.copy(UnixCopyFile.java:526)
    sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:253)
    java.nio.file.Files.copy(Files.java:1274)
    org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$copyRecursive(Utils.scala:608)
    org.apache.spark.util.Utils$.copyFile(Utils.scala:579)
    org.apache.spark.util.Utils$.doFetchFile(Utils.scala:664)
    org.apache.spark.util.Utils$.fetchFile(Utils.scala:463)
    org.apache.spark.deploy.worker.DriverRunner.downloadUserJar(DriverRunner.scala:154)
    org.apache.spark.deploy.worker.DriverRunner.prepareAndRunDriver(DriverRunner.scala:172)
    org.apache.spark.deploy.worker.DriverRunner$$anon$1.run(DriverRunner.scala:91)
17/06/20 16:41:31 INFO RestSubmissionClient: Server responded with CreateSubmissionResponse:
{
  "action" : "CreateSubmissionResponse",
  "message" : "Driver successfully submitted as driver-20170620204130-0005",
  "serverSparkVersion" : "2.1.1",
  "submissionId" : "driver-20170620204130-0005",
  "success" : true
}

来自Spark工作节点的日志:

 2017-06-20T20:41:30.807403232Z 17/06/20 20:41:30 INFO Worker: Asked to launch driver driver-20170620204130-0005
2017-06-20T20:41:30.817248508Z 17/06/20 20:41:30 INFO DriverRunner: Copying user jar file:///home/me/workspace/myproj/target/scala-2.11/myproj-assembly-0.1.0.jar to /opt/spark/work/driver-20170620204130-0005/myproj-assembly-0.1.0.jar
2017-06-20T20:41:30.883645747Z 17/06/20 20:41:30 INFO Utils: Copying /home/me/workspace/myproj/target/scala-2.11/myproj-assembly-0.1.0.jar to /opt/spark/work/driver-20170620204130-0005/myproj-assembly-0.1.0.jar
2017-06-20T20:41:30.885217508Z 17/06/20 20:41:30 INFO DriverRunner: Killing driver process!
2017-06-20T20:41:30.885694618Z 17/06/20 20:41:30 WARN Worker: Driver driver-20170620204130-0005 failed with unrecoverable exception: java.nio.file.NoSuchFileException: home/me/workspace/myproj/target/scala-2.11/myproj-assembly-0.1.0.jar 

有什么想法吗?谢谢 更新 以下命令正确吗?
./spark-submit --master spark://192.168.42.80:32141 --deploy-mode cluster file:///home/me/workspace/myproj/target/scala-2.11/myproj-assembly-0.1.0.jar

更新

我认为我对Spark有了更深入的理解,也明白了我之前遇到spark-submit error: ClassNotFoundException问题的原因。关键点在于,尽管这里使用了 REST URL:REST URL: spark://127.0.1.1:6066 (集群模式) ,但应用程序JAR包在提交后不会上传到集群中,这与我的理解不同。因此,Spark集群找不到应用程序JAR包,并且无法加载主类。

我将尝试查找如何设置Spark集群并使用集群模式提交应用程序。不知道客户端模式是否会在流处理作业中使用更多资源。


有趣...为什么你使用 32141 而不是 7077?你能否去掉 file:// 并只使用没有前缀的常规路径? - Jacek Laskowski
@JacekLaskowski 1,Spark在Kubernetes上运行,因此端口为32141->6066。2,我尝试了常规路径,但不起作用。 - BAE
去掉 --deploy-mode cluster 有什么区别吗?如果我没记错的话,Kubernetes是Spark支持的新功能,所以错误在包中。 - Jacek Laskowski
1
@BAE,你找到解决方法了吗?我有一个类似的目标(使用集群模式cluster部署spark submit到独立集群),也遇到了同样的问题。尽管是用docker容器。 - sujit
@BAE,是的,必须这样做。实际上,我发现在集群部署模式下调用spark-submit的主机上不需要解析指定的jar路径。似乎它只是作为参数提交给驱动程序和执行程序,在那里需要访问jar文件。 - sujit
显示剩余3条评论
3个回答

1

您正在使用集群模式提交应用程序,这意味着Spark驱动程序将在某个地方创建,文件必须存在于此处。

这就是为什么在Spark中,建议使用分布式文件系统,如HDFS或S3。


0
块引用更新
我认为我对Spark有了更深入的理解,也知道了为什么会出现“ClassNotFoundException”错误。关键在于,虽然这里使用了“REST URL: spark://127.0.1.1:6066”这个词,但是应用程序JAR包在提交后不会被上传到集群中,这与我的理解不同。因此,Spark集群无法找到应用程序JAR包,也无法加载主类。
这就是为什么您必须将JAR文件定位到主节点或在Spark提交之前将其放入HDFS的原因。
以下是如何操作: 1)使用Ubuntu命令将文件传输到主节点。
$ scp <file> <username>@<IP address or hostname>:<Destination>

例如:

$ scp mytext.txt tom@128.140.133.124:~/

2.) 将文件传输到HDFS:

$ hdfs dfs -put mytext.txt

希望我能帮到你。

-1

独立模式集群想要将jar文件传递到hdfs,因为驱动程序在集群中的任何节点上。

hdfs dfs -put xxx.jar /user/
spark-submit --master spark://xxx:7077 \
--deploy-mode cluster \
--supervise \
--driver-memory 512m \
--total-executor-cores 1 \
--executor-memory 512m \
--executor-cores 1 \
--class com.xiyou.bi.streaming.game.common.DmMoGameviewOnlineLogic \
hdfs://xxx:8020/user/hutao/xxx.jar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接