我使用群集模式运行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"
上述命令在客户端模式下正常工作。但是当我在集群模式下使用它时,我发现了类未找到异常
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?
答案 0 :(得分:5)
在客户端模式下,依赖的jar将被复制到 / var / lib / spark / work目录,而在集群模式下则不是。
在群集模式下,驱动程序pragram在群集中运行而不是在本地(与客户端模式相比),并且相关的jar应该可以在群集中访问,否则驱动程序和执行程序将抛出" java.lang.NoClassDefFoundError&#34 ;异常。
实际上使用spark-submit时,应用程序jar以及--jars选项中包含的任何jar都将自动传输到群集。
您的额外广告罐可以添加到 - jars ,它们会自动复制到群集中。
请参阅"高级依赖管理"以下部分链接:
http://spark.apache.org/docs/latest/submitting-applications.html
答案 1 :(得分:1)
正如火花文件所说, 1.将所有jar和依赖项保留在集群中的所有节点中相同的本地路径<或strong>中 2.保持jar是分布式文件系统,所有节点都可以访问。