如何给依赖的罐子以集群模式提交火花
How to give dependent jars to spark submit in cluster mode
我 运行 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"
以上命令在客户端模式下运行良好。但是当我在集群模式下使用它时,我得到 class not found exception
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 节点上以相同的名称挂载了相同的目录。我仍然得到错误。它如何能够选择也在同一目录下但不是依赖罐的应用程序罐?
正如 spark 文档所说,
- 将所有 jar 和依赖项保存在 集群中所有节点 或
中的相同本地路径中
- 保留 jar 是分布式文件系统,所有节点都可以访问。
In client mode the dependent jars are getting copied to the
/var/lib/spark/work directory whereas in cluster mode it is not.
在集群模式下,驱动程序在集群中 运行 而不是在本地(与客户端模式相比)并且依赖的 jar 应该在集群中可以访问,否则驱动程序和执行程序将抛出 "java.lang.NoClassDefFoundError"异常。
实际上,当使用 spark-submit 时,应用程序 jar 以及 --jars 选项中包含的任何 jar 都会自动传输到集群。
您可以将额外的 jar 添加到 --jars,它们将自动复制到集群。
请参阅下面的 "Advanced Dependency Management" 部分 link:
http://spark.apache.org/docs/latest/submitting-applications.html
我 运行 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"
以上命令在客户端模式下运行良好。但是当我在集群模式下使用它时,我得到 class not found exception
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 节点上以相同的名称挂载了相同的目录。我仍然得到错误。它如何能够选择也在同一目录下但不是依赖罐的应用程序罐?
正如 spark 文档所说,
- 将所有 jar 和依赖项保存在 集群中所有节点 或 中的相同本地路径中
- 保留 jar 是分布式文件系统,所有节点都可以访问。
In client mode the dependent jars are getting copied to the /var/lib/spark/work directory whereas in cluster mode it is not.
在集群模式下,驱动程序在集群中 运行 而不是在本地(与客户端模式相比)并且依赖的 jar 应该在集群中可以访问,否则驱动程序和执行程序将抛出 "java.lang.NoClassDefFoundError"异常。
实际上,当使用 spark-submit 时,应用程序 jar 以及 --jars 选项中包含的任何 jar 都会自动传输到集群。
您可以将额外的 jar 添加到 --jars,它们将自动复制到集群。
请参阅下面的 "Advanced Dependency Management" 部分 link:
http://spark.apache.org/docs/latest/submitting-applications.html