Spark Jar包問題


通常我們將spark任務編寫后打包成jar包,使用spark-submit進行提交,因為spark是分布式任務,如果運行機器上沒有對應的依賴jar文件就會報ClassNotFound的錯誤。 

下面有二個解決方法:

方法一:spark-submit –jars

根據spark官網,在提交任務的時候指定–jars,用逗號分開。這樣做的缺點是每次都要指定jar包,如果jar包少的話可以這么做,但是如果多的話會很麻煩。

spark-submit --master yarn-client --jars ***.jar,***.jar(你的jar包,用逗號分隔) mysparksubmit.jar

如果還不行,使用driver-class-path但是這種方法task執行會報錯,必須保證driver和jar在同一台機器。

spark1.4之前有詭異的這種問題,據說是spark修復了。另外可以嘗試-conf。

方法二:extraClassPath

提交時在spark-default中設定參數,將所有需要的jar包考到一個文件里,然后在參數中指定該目錄就可以了,較上一個方便很多:

spark.executor.extraClassPath=/home/lib/*

spark.driver.extraClassPath=/home/lib/*

需要注意的是,你要在所有可能運行spark任務的機器上保證該目錄存在,並且將jar包考到所有機器上。這樣做的好處是提交代碼的時候不用再寫一長串jar了,缺點是要把所有的jar包都拷一遍

Spark應用程序第三方jar文件依賴解決方案

第一種方式

操作:將第三方jar文件打包到最終形成的spark應用程序jar文件中

應用場景:第三方jar文件比較小,應用的地方比較少

第二種方式

操作:使用spark-submit提交命令的參數: --jars

要求:

1、使用spark-submit命令的機器上存在對應的jar文件

2、至於集群中其他機器上的服務需要該jar文件的時候,通過driver提供的一個http接口來獲取該jar文件的(例如:http://192.168.187.146:50206/jars/mysql-connector-java-5.1.27-bin.jar Added By User)

## 配置參數:--jars JARS

如下示例:

$ bin/spark-shell --jars /opt/cdh-5.3.6/hive/lib/mysql-connector-java-5.1.27-bin.jar

應用場景:要求本地必須要有對應的jar文件

第三種方式

操作:使用spark-submit提交命令的參數: --packages

## 配置參數:--packages  jar包的maven地址

如下示例:

$ bin/spark-shell --packages  mysql:mysql-connector-java:5.1.27--repositories http://maven.aliyun.com/nexus/content/groups/public/

## --repositories 為mysql-connector-java包的maven地址,若不給定,則會使用該機器安裝的maven默認源中下載

## 若依賴多個包,則重復上述jar包寫法,中間以逗號分隔

## 默認下載的包位於當前用戶根目錄下的.ivy/jars文件夾中

應用場景:本地可以沒有,集群中服務需要該包的的時候,都是從給定的maven地址,直接下載

第四種方式

操作:更改Spark的配置信息:SPARK_CLASSPATH, 將第三方的jar文件添加到SPARK_CLASSPATH環境變量中

注意事項:要求Spark應用運行的所有機器上必須存在被添加的第三方jar文件

A.創建一個保存第三方jar文件的文件夾:

命令:$ mkdir external_jars

B.修改Spark配置信息 命令:$ vim conf

/spark-env.sh修改內容:

SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/cdh-5.3.6/spark/external_jars/*

C.將依賴的jar文件copy到新建的文件夾中

命令:

$ cp /opt/cdh-5.3.6/hive/lib/mysql-connector-java-5.1.27-bin.jar ./external_jars/

 

應用場景:依賴的jar包特別多,寫命令方式比較繁瑣,被依賴包應用的場景也多的情況下

備注:(只針對spark on yarn(cluster)模式)

spark on yarn(cluster),如果應用依賴第三方jar文件

最終解決方案:將第三方的jar文件copy到${HADOOP_HOME}/share/hadoop/common/lib文件夾中(Hadoop集群中所有機器均要求copy)

針對Hive出現的問題,請將hive所需的jar *的形式添加到yarn classpath中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM