我在使用 scala 构建 spark jar 时遇到问题。这是一件非常简单的事情,我想通过 JDBC 以编程方式访问 mysql 服务器并将其加载到 spark 数据帧中。我可以让它在 spark shell 中工作,但我无法打包一个与 spark submit 一起工作的 jar。它会打包,但在运行时,失败并显示
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3310/100million
我的 spark-submit 命令是
./bin/spark-submit ~/path/to/scala/project/target/scala-2.10/complete.jar --driver-class-path ~/path/to/mysql-connector-java -5.1.37-bin.jar
我的 build.sbt 看起来像
name := "sql_querier"
version := "1.0"
scalaVersion := "2.10.4"
sbtVersion := "0.13.7"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.5.1" % "provided"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.5.1" % "provided"
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.37"
assemblyJarName in assembly := "complete.jar"
mainClass in assembly := Some("sql_querier")
offline := true
我的代码非常简单
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
object sql_querier{
def main(args: Array[String]) {
val sc = new org.apache.spark.SparkContext()
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val url="jdbc:mysql://databaseurl:portno/database"
val prop = new java.util.Properties
prop.setProperty("user","myuser")
prop.setProperty("password","mydatabase")
val cats=sqlContext.read.jdbc(url, "categories", prop)
cats.show
}
}
我在其中隐藏了用户密码和数据库 URL 的实际值。 我在项目中也有一个文件,它添加了 sbt assembly 插件,但这没有任何问题。当使用指向 mysql jar 的 --driver-class-path 选项启动 spark shell 时,我可以运行命令并从 mysql 数据库中提取数据。
如果能提供我在构建过程中做错了什么的任何线索,我们将不胜感激。
院长
编辑:尝试了一大堆东西,包括不同版本的 jdbc 驱动程序和添加行
sc.addJar("/Users/dean.wood/data_science/scala/sqlconn/mysql-connector-java-5.0.8-bin.jar")
Class.forName("com.mysql.jdbc.Driver")
到scala文件和行
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs@_*) =>
xs.map(_.toLowerCase) match {
case ("manifest.mf" :: Nil) |
("index.list" :: Nil) |
("dependencies" :: Nil) |
("license" :: Nil) |
("notice" :: Nil) => MergeStrategy.discard
case _ => MergeStrategy.first // was 'discard' previousely
}
case "reference.conf" => MergeStrategy.concat
case _ => MergeStrategy.first
}
到构建文件。
似乎没有任何帮助。
最佳答案
解决了。我在构建文件或 scala 文件中没有做错任何事。
事实证明,如果 spark-submit 出现在可执行文件的路径之前,它只会查看 --driver-class-path。所以为了让它工作,我使用了上面的 spark-submit 命令,而不是:
./bin/spark-submit --driver-class-path ~/path/to/mysql-connector-java-5.1.37-bin.jar ~/path/to/scala/project/target/scala-2.10/complete.jar
我怀疑要将其扩展到集群,我必须将 mysql 连接器添加到每个 worker,但那是以后的事了。
关于mysql - 将 java 类添加到 sbt 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33260929/