[英]Spark Can't Find JDBC Driver from SBT
我正在嘗試在Scala Spark應用程序中使用JDBC,並且正在使用sbt進行編譯。 但是,當我添加Class.forName("com.mysql.jdbc.Driver")
,它將引發ClassNotFoundException。
我的sbt文件是這樣的:
name := "SparkApp"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.1.0"
libraryDependencies += "com.databricks" %% "spark-csv" % "1.5.0"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.1.0"
libraryDependencies += "mysql" % "mysql-connector-java" % "6.0.5"
據我所知,最后一行是添加JDBC驅動程序所需的全部,但它似乎沒有用。 我也嘗試過Class.forName("com.mysql.jdbc.Driver").newInstance()
但是結果相同,因此我認為問題在於根本沒有正確添加jdbc類。
您無需提供類名即可使用JDBC加載數據幀。 遵循Spark SQL文檔 ,您只需提供"jdbc"
作為數據源格式(並且確實將連接器添加為依賴項)並設置正確的選項:
val host: String = ???
val port: Int = ???
val database: String = ???
val table: String = ???
val user: String = ???
val password: String = ???
val options = Map(
"url" -> s"jdbc:mysql://$host:$port/$database?zeroDateTimeBehavior=convertToNull",
"dbtable" -> table,
"user" -> user,
"password" -> password)
val df = spark.read.format("jdbc").options(options).load()
當您將應用程序提交給Spark時,您必須在最終的jar文件中包含MySQL連接器,或者告訴spark-submit
將該包作為依賴項獲取:
spark-submit --packages mysql:mysql-connector-java:6.0.5 ...
該標志還可以在spark-shell
或pyspark
。
spark-submit \\ --class com.mypack.MyClass \\ --master yarn --deploy-mode cluster \\ --conf spark.executor.extraClassPath=$POSTGRESQL_JAR_PATH:$MYSQL_JAR_PATH \\ --conf spark.driver.extraClassPath=$POSTGRESQL_JAR_PATH:$MYSQL_JAR_PATH \\
其中,應使用jar文件的hdfs路徑設置$POSTGRESQL_JAR_PATH
和$MYSQL_JAR_PATH
。
希望這可以幫助。
如果您正在集群模式下運行,則spark.executor.extraClassPath
。 spark.driver.extraClassPath
如果正在本地運行)。
我建議將兩個選項都設置為更安全。
在提交如下所示的spark作業時,您應該通過驅動程序jar:
1)spark-submit --jars mysql-connector-java-5.1.39.jar和您傳遞的其余參數
2)如果您只想使用shell spark-shell --jars嘗試在本地使用mysql-connector-java-5.1.39.jar
將驅動程序更新為您已經可用的驅動程序,並提供該驅動程序的絕對路徑
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.