4

我在EMR上部署了Spark 1.6 4.4.0 我正在連接到部署在EC2上的datastax cassandra 2.2.5。EMR上的Spark + Cassandra LinkageError

連接使用spark-connector 1.4.2_s2.10將數據保存到cassandra(因爲它有番石榴14)但是,使用1.4.2版本的連接器從cassandra讀取數據失敗。

正確的組合暗示使用1.5.x,因此我開始使用1.5.0。 首先我遇到了番石榴問題,並使用userClasspathFirst解決方案修復了它。

spark-shell --conf spark.yarn.executor.memoryOverhead=2048 
--packages datastax:spark-cassandra-connector:1.5.0-s_2.10 
--conf spark.cassandra.connection.host=10.236.250.96 
--conf spark.executor.extraClassPath=/home/hadoop/lib/guava-16.0.1.jar:/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/* 
--conf spark.driver.extraClassPath=/home/hadoop/lib/guava-16.0.1.jar:/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/* 
--conf spark.driver.userClassPathFirst=true 
--conf spark.executor.userClassPathFirst=true 

現在,我得到過去番石榴16錯誤,但是因爲我使用的是userClassPathFirst我面臨的另一個衝突,我沒有得到任何的方式來解決這個問題。

Lost task 2.1 in stage 2.0 (TID 6, ip-10-187-78-197.ec2.internal): java.lang.LinkageError: 
loader constraint violation: loader (instance of org/apache/spark/util/ChildFirstURLClassLoader) previously initiated loading for a different type with name "org/slf4j/Logger" 

當我重複使用Java代碼而不是spark-shell的步驟時,我遇到了同樣的麻煩。 任何解決方案,以通過它,或任何其他更清潔的方式?

謝謝!

+0

實際上,我有完全一樣的問題。 – LiMuBei

+0

我們得到了根本原因,這是一些相互矛盾的依賴。當我從軟件包中刪除所有依賴關係並且只有絕對必要的時候,問題就消失了。我無法確定造成依賴性衝突的確切程序包,但確定它存在根本原因。我們重新構建了代碼,將其分解爲兩個包,一個包含所有業務邏輯,另一個包含非常精簡的部分,只是爲了激發工作。 – lazywiz

+1

嗯,除了Spark之外,我唯一的依賴是Cassandra連接器,我仍然遇到了錯誤。對我來說,它看起來像這裏描述的問題:http://techblog.applift.com/upgrading-spark因此基本上兩個類加載器碰撞出於某種原因。 – LiMuBei

回答