Spark on Yarn:java.sql.SQLException: No suitable driver found for jdbc:microsoft:sqlserver://localhost\\db_instance_name:1433;databaseName=db_name


本文只是針對當前特定環境下,出現的問題找不到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驅動。是否安裝,我不確定(集群我們管理不了)。希望看到該文章的讀者清楚這個事情。

 


免責聲明!

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



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