mysql - 将 java 类添加到 sbt 程序集

标签 mysql scala jdbc apache-spark

我在使用 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/

相关文章:

MySQL。自动添加到另一个表中

android - 在 onCreate 之前将来自 mySQL 的信息放入 Fragment textView 中

scala - spark 数据框将行值转换为列名

scala - 将 emacs 连接到远程 ensime 服务器

java - 如果在 Tomcat 服务器关闭时在线程中使用 JDBC 数据库连接,它们会被释放吗?

mysql - 在 Discord.js 和 MySQL 中注册命令

scala - Stream#filter 耗尽了 1,000,000 个项目的内存

java - 无法将连接转换为 oracle.jdbc.OracleConnection

mysql - 支持 Apps Script Web App 5000 个并发用户

mysql - 如何将 3 种不同类型的 SQL 查询合并为 1 种