本文只是針對當前特定環境下,出現的問題找不到sqljdbc驅動的案例。具體出現原因,可能是spark版本問題,也可能是集群配置問題。
- yarn-client方式下:
通過--jars參數指定驅動文件位置,提交后提示:“。。。No suitable driver found for jdbc:。。。”;
后來參考到文章:Spark insertIntoJDBC找不到Mysql驅動解決方法 中介紹到:是由於版本問題,導致的我們程序提交不上去的錯誤問題。
於是修改提交參數使用--driver-class-path方式指定驅動包文件的位置,使用client方式提交問題解決了。
提交腳本為:
#!/bin/sh spark-submit --deploy-mode client --class MyMain --driver-class-path /app/tt/service/jars/sqljdbc4.jar --num-executors 320 --executor-cores 1 --driver-memory 4g --executor-memory 6g My.jar
- yarn-cluster方式下:
提交腳本:
#!/bin/sh spark-submit --master yarn-cluster --class MyMain --jars /app/tt/service/jars/sqljdbc4.jar --num-executors 320 --executor-cores 1 --driver-memory 4g --executor-memory 6g My.jar
通過閱讀相關文件,了解到:在spark1.4版本之后,--jars指定驅動方式也支持driver驅動系統加載方式。但是,實際測試結果卻不是這樣子的,使用-driver-class-path和--jars這兩種方式指定jdbc驅動包的位置都是不能正確提交到cluster上的。
需要注意的問題:如果提示未找到jdbc驅動包,請確認你的卻驅動包地址是否正確、確認你的包是否是正確的驅動包(比如你是需要sqljdbc,這里就不要填寫為ojdbc驅動包。)
我的訪問sqlserver數據庫表的代碼書寫內容:
val prop = new Properties() prop.setProperty("user", "xx") prop.setProperty("password", "xxxx") val lnglat_offset_df = hiveContext.read.jdbc("jdbc:sqlserver://localhost\\db_instance_name:1433;DatabaseName=db_name", "[dbo].[tb_test]", prop)
在我們自己的集群上解決驅動包在cluster方式下提交時,提示:“。。。No suitable driver found for jdbc:。。。”的解決方案:在各個子節點上安裝對應的jdbc驅動包。
經過找高手幫忙最終解決了該問題,在cluster方式提交不上去的原因結論:我們數據庫連接方式寫的有問題。
正確的代碼應該是:
val lnglat_offset_df = hiveContext.read.format("jdbc") .options(Map("url" -> "jdbc:sqlserver://localhost\\db_instance_name:1433;DatabaseName=db_name;user=xx;password=xxx", "dbtable" -> "dbo.tb_test", "driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver")) .load()
但是,疑問高手在解決問題時是否在各個節點上安裝了jdbc驅動。是否安裝,我不確定(集群我們管理不了)。希望看到該文章的讀者清楚這個事情。