Apache spark 如何在集群模式下为相关JAR提供spark submit

Apache spark 如何在集群模式下为相关JAR提供spark submit,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我正在使用群集模式运行spark进行部署。下面是命令 JARS=$JARS_HOME/amqp-client-3.5.3.jar,$JARS_HOME/nscala-time_2.10-2.0.0.jar,\ $JARS_HOME/rabbitmq-0.1.0-RELEASE.jar,\ $JARS_HOME/kafka_2.10-0.8.2.1.jar,$JARS_HOME/kafka-clients-0.8.2.1.jar,\ $JARS_HOME/spark-streaming-kafka

我正在使用群集模式运行spark进行部署。下面是命令

JARS=$JARS_HOME/amqp-client-3.5.3.jar,$JARS_HOME/nscala-time_2.10-2.0.0.jar,\
$JARS_HOME/rabbitmq-0.1.0-RELEASE.jar,\
$JARS_HOME/kafka_2.10-0.8.2.1.jar,$JARS_HOME/kafka-clients-0.8.2.1.jar,\
$JARS_HOME/spark-streaming-kafka_2.10-1.4.1.jar,\
$JARS_HOME/zkclient-0.3.jar,$JARS_HOME/protobuf-java-2.4.0a.jar

dse spark-submit -v --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \
 --executor-memory 512M \
 --total-executor-cores 3 \
 --deploy-mode "cluster" \
 --master spark://$MASTER:7077 \
 --jars=$JARS \
 --supervise \
 --class "com.testclass" $APP_JAR  input.json \
 --files "/home/test/input.json"
上述命令在客户端模式下工作正常。但当我在集群模式下使用它时,我得到了类NotFoundException

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:58)
    at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)
Caused by: java.lang.NoClassDefFoundError: org/apache/spark/streaming/kafka/KafkaUtils$
在客户端模式下,依赖jar被复制到/var/lib/spark/work目录,而在集群模式下则不是。请帮我解决这个问题

编辑:


我正在使用nfs,并且在所有spark节点上以相同的名称挂载了相同的目录。但我还是得到了错误。它如何能够选择同样位于同一目录下的应用程序jar,而不是依赖的jar

正如spark文档所说

  • 将所有JAR和依赖项保持在集群中所有节点的相同本地路径中
  • 将jar保存在所有节点都可以访问的分布式文件系统中
  • 在客户端模式下,从属JAR将被复制到 /var/lib/spark/work目录,而在集群模式下则不是

    在集群模式下,驱动程序pragram正在集群中运行,而不是在本地模式下运行(与客户端模式相比),并且依赖JAR应该可以在集群中访问,否则驱动程序和执行器将抛出“java.lang.NoClassDefFoundError”异常

    实际上,在使用spark submit时,应用程序jar以及--jars选项中包含的任何jar将自动传输到集群

    您的额外JAR可以添加到--JAR,它们将自动复制到集群

    请参阅下面链接中的“高级依赖项管理”部分:

    我将所有JAR保存在nfs文件系统中,并在所有spark节点中安装了相同的JAR。我猜它们不包括在类路径中。您可以启用history server并检查应用程序环境及其类路径。检查“NoClassDefFoundError”异常非常有用。是的,你是对的。我使用了dse-v,发现类路径元素在集群部署模式下为空。但在客户端模式下,它正在被填充。我不确定我在这里遗漏了什么。好消息:),我认为您最好使用--jars参数,建议将附加jar分发到集群模式。除此之外,我有时使用“spark.driver.extraClassPath”显式地将JAR添加到驱动程序类路径(因为有时我发现——JAR仍然不能添加到类路径)。请尝试一下。感谢您的帮助。经过两天的努力,使用了-驱动程序类路径和依赖JAR。还发现Jar应该用冒号分隔,而不是逗号分隔。嗨@WoodChopper,你能告诉我们如何将Jar文件放入HDFS中,以便执行者能够获取它吗?运行Spark时,命令行是如何执行此操作的-submit@SamBerchman将jar保存在hdfs位置——conf spark.warn.jarshdfs://mylocation.