在 Spark 客户端模式下为执行程序添加额外的类路径

Posted

技术标签:

【中文标题】在 Spark 客户端模式下为执行程序添加额外的类路径【英文标题】:Add extra classpath to executors in Spark client mode 【发布时间】:2016-07-12 03:57:32 【问题描述】:

我正在使用带有独立集群管理器的 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) 上的工作进程:

火花 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-bin-hadoop2.6/lib/spark-assembly-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 放在我所有的工作节点中。

有谁知道如何强制执行者使用我的 jar 而不是 spark 程序集的 jar?

【问题讨论】:

【参考方案1】:

尝试将--packages 选项用于spark-submit

spark-submit --packages org.apache.avro:avro:1.7.8 ....

类似的东西。如果您不使用spark-submit,请使用它——这正是它的用途。

【讨论】:

我实际上是在使用sparkConf.setMaster("spark://....") 从 SBT 以部署模式“客户端”运行我的应用程序。在我的情况下,您所说的相当于:sparkConf.setJars(Seq("file://home/tmouron/avro-1.7.8.jar"))。但是我对这个附加行有同样的问题:正在使用 avro-1.7.7。

以上是关于在 Spark 客户端模式下为执行程序添加额外的类路径的主要内容,如果未能解决你的问题,请参考以下文章

装饰模式

7,装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。继承关系的一个替换方案。

Spark内核概述

Spark的四种运行模式

设计模式——装饰器模式

集群模式执行Spark程序(第七弹)