在 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)动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。继承关系的一个替换方案。