[英]Spark Unable to find JDBC Driver
所以我一直在使用sbt with assembly將我的所有依賴項打包成一個jar用於我的spark作業。 我有幾個工作,我使用c3p0
設置連接池信息,廣播出來,然后在RDD上使用foreachPartition
然后獲取連接,並將數據插入數據庫。 在我的sbt構建腳本中,我包含了
"mysql" % "mysql-connector-java" % "5.1.33"
這可確保JDBC連接器與作業打包在一起。 一切都很好。
所以最近我開始玩SparkSQL,並意識到簡單地采用數據幀並將其保存到具有1.3.0
新功能的jdbc源更容易
我收到以下異常:
java.sql.SQLException:在java.sql中找不到合適的jdbc驅動程序:mysql://some.domain.com/myschema?user = user&password = password at java.sql.DriverManager.getConnection(DriverManager.java:596)。的DriverManager.getConnection(DriverManager.java:233)
當我在本地運行時,我通過設置繞過它
SPARK_CLASSPATH=/path/where/mysql-connector-is.jar
最終我想知道的是,為什么這個工作不能找到驅動程序什么時候應該打包它呢? 我的其他工作從未遇到過這個問題。 從我可以告訴c3p0
和數據幀代碼兩者都使用java.sql.DriverManager
(它從我可以告訴你處理導入一切)所以它應該工作得很好? 如果有什么東西阻止匯編方法工作,我需要做些什么來使其工作?
這個人有類似的問題: http : //apache-spark-user-list.1001560.n3.nabble.com/How-to-use-DataFrame-with-MySQL-td22178.html
您是否已將連接器驅動程序更新到最新版本? 你在調用load()時也指定了驅動程序類嗎?
Map<String, String> options = new HashMap<String, String>();
options.put("url", "jdbc:mysql://localhost:3306/video_rcmd?user=root&password=123456");
options.put("dbtable", "video");
options.put("driver", "com.mysql.cj.jdbc.Driver"); //here
DataFrame jdbcDF = sqlContext.load("jdbc", options);
在spark / conf / spark-defaults.conf中,您還可以將spark.driver.extraClassPath和spark.executor.extraClassPath設置為MySql驅動程序的路徑.jar
火花驅動程序和執行程序都需要類路徑上的mysql驅動程序,所以指定
spark.driver.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
spark.executor.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
spark文檔中明確提到了這些選項: - --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar
我正在做的錯誤是在我的應用程序的jar之后提到這些選項。
但是正確的方法是在spark-submit之后立即指定這些選項:
spark-submit --driver-class-path /somepath/project/mysql-connector-java-5.1.30-bin.jar --jars /somepath/project/mysql-connector-java-5.1.30-bin.jar --class com.package.MyClass target/scala-2.11/project_2.11-1.0.jar
使用spark 2.2.0,通過在python腳本中為SparkSession會話添加額外的類路徑信息來解決問題:
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.driver.extraClassPath", "/path/to/jdbc/driver/postgresql-42.1.4.jar") \
.getOrCreate()
請參閱官方文檔https://spark.apache.org/docs/latest/configuration.html
就我而言,spark不是從cli命令啟動的,而是來自django框架https://www.djangoproject.com/
spark.driver.extraClassPath在客戶端模式下不起作用:
注意:在客戶端模式下,不能直接在應用程序中通過SparkConf設置此配置,因為驅動程序JVM已在此時啟動。 相反,請通過--driver-class-path命令行選項或在默認屬性文件中設置它。
在Spark 1.0+中已棄用Env變量SPARK_CLASSPATH。
您應該首先將jdbc驅動程序jar復制到同一本地文件系統路徑下的每個執行程序中,然后在spark-submit中使用以下選項:
--driver-class-path "driver_local_file_system_jdbc_driver1.jar:driver_local_file_system_jdbc_driver2.jar"
--class "spark.executor.extraClassPath=executors_local_file_system_jdbc_driver1.jar:executors_local_file_system_jdbc_driver2.jar"
例如,在TeraData的情況下,您需要terajdbc4.jar和tdgssconfig.jar。
或者在所有工作節點上修改compute_classpath.sh,Spark文檔說:
JDBC驅動程序類必須對客戶端會話和所有執行程序上的原始類加載器可見。 這是因為Java的DriverManager類進行了安全檢查,導致它忽略了當打開連接時原始類加載器不可見的所有驅動程序。 一種方便的方法是修改所有工作節點上的compute_classpath.sh以包含驅動程序JAR。
存在一個簡單的Java技巧來解決您的問題。 您應該指定Class.forName()
實例。 例如:
val customers: RDD[(Int, String)] = new JdbcRDD(sc, () => {
Class.forName("com.mysql.jdbc.Driver")
DriverManager.getConnection(jdbcUrl)
},
"SELECT id, name from customer WHERE ? < id and id <= ?" ,
0, range, partitions, r => (r.getInt(1), r.getString(2)))
檢查文檔
我在群集模式下通過Mesos群集運行作業時遇到同樣的問題。
要將JDBC驅動程序添加到系統類路徑而不是框架類路徑,必須使用JDBC驅動程序。 我只是通過在集群的每個實例中的文件spark-defaults.conf
中添加依賴項來找到它的方法。
要添加的屬性是spark.driver.extraClassPath
和spark.executor.extraClassPath
,並且路徑必須位於本地文件系統中。
我將jar文件添加到spark-env.sh中的SPARK_CLASSPATH,它可以工作。
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/local/spark-1.6.3-bin-hadoop2.6/lib/mysql-connector-java-5.1.40-bin.jar
簡單的方法是將“ mysql-connector-java-5.1.47.jar ”復制到“spark-2.4.3 \\ jars \\”目錄中
當我試圖從我的Windows機器上運行spark-shell命令時,我遇到了同樣的問題。 您為驅動程序位置以及將要使用的jar傳遞的路徑應該是雙引號,否則會被誤解,您將無法獲得所需的確切輸出。
您還必須從以下鏈接安裝SQL Server的JDBC驅動程序 : JDBC Driver
我已經使用下面的命令在我的Windows機器上為我工作正常:
spark-shell --driver-class-path“C:\\ Program Files \\ Microsoft JDBC Driver 6.0 for SQL Server \\ sqljdbc_6.0 \\ enu \\ jre8 \\ sqljdbc42.jar”--jars“C:\\ Program Files \\ Microsoft JDBC Driver 6.0 for SQL Server \\ sqljdbc_6.0 \\ enu \\ jre8 \\ sqljdbc42.jar“
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.