我将Spark 1.5.1与独立集群管理器一起使用。 Spark的默认spark-assembly-1.5.1-hadoop2.6.0.jar
包括Avro 1.7.7。我想将我的自定义Avro库用于我的所有Spark工作,我们称之为Avro 1.7.8。这在开发模式下完美运行(master = local [*])。但是,当我以客户端模式将我的应用程序提交到群集时,执行程序仍然使用Avro 1.7.7库。
URL url = getClass().getClassLoader().getResource(GenericData.class.getName().replace('.','/')+".class");
当我打印时,我的遗嘱执行人员的日志显示:
/opt/spark/lib/spark-assembly-1.5.1-hadoop2.6.0.jar/org/apache/avro/generic/GenericData.class
以下是我在工作节点上的spark-env.sh的一部分:
export SPARK_WORKER_OPTS="-Dspark.executor.extraClassPath=/home/ansible/avro-1.7.8.jar -Dspark.executor.userClassPathFirst=true
这是工作节点(ps aux | grep worker
)上的工作进程:
spark 955 1.8 1.9 4161448 243600? Sl 13:29 0:09 /usr/java/jdk1.7.0_79/jre/bin/java -cp /home/ansible/avro-1.7.8.jar:/etc/spark-worker/:/opt/spark- 1.5.1彬hadoop2.6 / LIB /火花组装1.5.1-hadoop2.6.0.jar:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-api-jdo-3.2 .6.jar:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus-rdbms-3.2.9.jar:/opt/spark-1.5.1-bin-hadoop2.6/lib/datanucleus -core-3.2.10.jar -Dspark.executor.extraClassPath = / home / ansible / avro-1.7.8.jar -Dspark.executor.userClassPathFirst = true -Xms512m -Xmx512m -XX:MaxPermSize = 256m org.apache.spark .deploy.worker.Worker --webui-port 8081 spark:// spark-a-01:7077
显然,我把这个jar:/home/ansible/avro-1.7.8.jar
放在我的所有工作节点中。
有谁知道如何强迫执行者使用我的罐子而不是火花装配件?
答案 0 :(得分:0)
尝试使用--packages
选项spark-submit
:
spark-submit --packages org.apache.avro:avro:1.7.8 ....
这样的事情。如果您不使用spark-submit
,请使用它 - 这正是它的用途。