1. 程式人生 > >Spark執行在EMR Jar包(guava)衝突問題

Spark執行在EMR Jar包(guava)衝突問題

問題描述:

    執行環境:          EMR  使用Spark 1.6.3, 這個版本的Spark主要依賴的包
  • guava-14.0.1
  • commons-configuration-1.6
    問題: Spark程式執行在EMR的時候發生Jar包衝突(主要是guava和commons-configuration兩個包發生衝突), 程式中需要使用guava-20.0以及commons-configuration-1.10兩個包,      本地執行沒有問題,放在EMR上執行則報如下錯誤:      
 java.lang.NoSuchMethodError: org.apache.commons.configuration.MapConfiguration.<init>(Ljava/util/Properties;)V

        這應該是程式在執行時預設使用了的EMR本地的jar包(可能由於配置問題,查看了配置檔案沒找到相關配置),由於不知道EMR的jar包如何更新,遂採用以下方式解決

解決方案:

     在spark-submit的時候增加 :           --driver-class-path $PROJECT_HOME/guava-20.0.jar:$PROJECT_HOME/commons-configuration-1.10.jar \
   --jars $PROJECT_HOME/guava-20.0.jar,$PROJECT_HOME/commons-configuration-1.10.jar \      即可使用自己的jar包執行      目前看到的對這兩個引數的解釋,並沒有太懂        
--jars 逗號分隔的本地jar包,包含在driver和executor的classpath下
--driver-class-path 傳給driver的額外的類路徑
2017-07-13 Property Name: spark.driver.extraClassPath
Meaning: Extra classpath entries to prepend to the classpath of the driver. 
Note: In client mode, this config must not be set through theSparkConf directly in your application, because the driver JVM has already started at that point. Instead, please set this through the 
--driver-class-path command line option or in your default properties file.

 
  找到官方文件對 --driver-class-path 的介紹,應該是: 加在 drvier的classpath之前的額外classpath入口, 非client模式下也可通過spark的default.conf的spark.driver.extraClassPath引數進行配置 (持續更新中...) 參考       http://www.aboutyun.com/thread-20517-1-1.html      https://github.com/endymecy/spark-config-and-tuning/blob/master/config.md