Spark Standalone 如何将本地 .jar 文件传递​​给集群

Spark Standalone how to pass local .jar file to cluster

我有一个集群,有两个工人和一个主人。 为了启动 master 和 workers,我在 master 的机器 中使用 sbin/start-master.shsbin/start-slaves.sh。然后,master UI 告诉我 slaves 还活着(所以,到目前为止一切正常)。当我想使用 spark-submit 时,问题就来了。

我在我的本地机器上执行这个命令:

spark-submit --master spark://<master-ip>:7077 --deploy-mode cluster /home/user/example.jar

但是弹出如下错误:ERROR ClientEndpoint: Exception from cluster was: java.nio.file.NoSuchFileException: /home/user/example.jar

我一直在研究堆栈溢出和 Spark 的文档,看来我应该将 spark-submit 命令的 application-jar 指定为 "Path to a bundled jar including your application and all dependencies. The URL must be globally visible inside of your cluster, for instance, an hdfs:// path or a file:// path that is present on all nodes."(因为它表示 https://spark.apache.org/docs/latest/submitting-applications.html).

我的问题是:如何将我的 .jar 设置为在集群内全局可见? 这里有一个类似的问题 Spark Standalone cluster cannot read the files in local filesystem 但解决方案不起作用为了我。

此外,我是不是做错了什么,使用 sbin/start-master.sh 在我的主机机器中初始化集群,然后在我的本地机器中执行 spark-submit ?我在主人的终端内初始化主人,因为我在 Spark 的文档中读到过,但这可能与问题有关。来自 Spark 的文档:

Once you’ve set up this file, you can launch or stop your cluster with the following shell scripts, based on Hadoop’s deploy scripts, and available in SPARK_HOME/sbin: [...] Note that these scripts must be executed on the machine you want to run the Spark master on, not your local machine.

非常感谢

编辑: 我已经在每个工作人员中复制了文件 .jar 并且它可以工作。但我的意思是要知道是否有更好的方法,因为这种方法让我每次创建新 jar 时都将 .jar 复制到每个工作人员。 (这是已发布 link Spark Standalone cluster cannot read the files in local filesystem 问题的答案之一)

@meisan 你的 spark-submit 命令遗漏了两件事。

  • 你的罐子应该添加标志 --jar
  • 包含您的驱动程序代码的文件,即主要功能。

现在你没有指定任何地方,如果你使用的是 scala 或 python 但简而言之,你的命令将类似于:

对于 python :

spark-submit --master spark://<master>:7077 --deploy-mode cluster --jar <dependency-jars> <python-file-holding-driver-logic>

对于 scala:

spark-submit --master spark://<master>:7077 --deploy-mode cluster --class <scala-driver-class> --driver-class-path <application-jar> --jar <dependency-jars>

此外,当您使用记录的标志时,spark 会负责将所需的文件和 jar 发送给执行程序。 如果要省略 --driver-class-path 标志,可以将环境变量 SPARK_CLASSPATH 设置为放置所有 jars 的路径。