2016-03-24 34 views
1

我正在使用Spark 1.5.1與獨立集羣管理器。 Spark的默認spark-assembly-1.5.1-hadoop2.6.0.jar包括Avro 1.7.7。我想爲我所有的Spark作業使用我自定義的Avro庫,我們稱之爲Avro 1.7.8。這可以在開發模式下完美工作(master = local [*])。但是,當我以客戶端模式將我的應用程序提交到羣集時,執行程序仍使用Avro 1.7.7庫。在Spark客戶端模式下向執行者添加額外的類路徑

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/通用/ GenericData.class

這裏是我的spark-env.sh的工作節點上的一部分:

export SPARK_WORKER_OPTS="-Dspark.executor.extraClassPath=/home/ansible/avro-1.7.8.jar -Dspark.executor.userClassPathFirst=true 

這裏是我的W酒店

火花955 1.8 1.9 4161448 243600:工作節點(ps aux | grep worker)上orker過程? 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端口8081火花://火花-A-01:7077

很顯然,我把這個罐子:在我所有的工作節點/home/ansible/avro-1.7.8.jar

有誰知道如何強制執行程序使用我的jar而不是spark組件的嗎?

回答

0

嘗試使用--packages選項​​:

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

類似的東西。如果您不使用​​,請使用它 - 這正是它的用途。

+0

實際上,我使用'sparkConf.setMaster(「spark:// ....」)''''''''''''在SBT的部署模式「client」中運行我的應用程序。相當於你在我的例子中說的是:'sparkConf.setJars(Seq(「file://home/tmouron/avro-1.7.8.jar」))'。但是我有這個額外的線路相同的問題:正在使用avro-1.7.7。 – tmouron

相關問題