Spark无法从SBT

时间:2017-03-01 15:32:54

标签: mysql scala apache-spark jdbc

我正在尝试在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类没有正确添加。

4 个答案:

答案 0 :(得分:2)

您不需要提供类名来使用JDBC来加载数据帧。在Spark SQL documentation之后,您只需提供"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时,您必须将MySQL连接器包含在最终的jar文件中,或者告诉spark-submit将包作为依赖项:

spark-submit --packages mysql:mysql-connector-java:6.0.5 ...

此标记也适用于spark-shellpyspark

答案 1 :(得分:0)

您的mysql驱动程序类 com.mysql.jdbc.Driver 它在运行时的类路径中不存在。如果你使用 spark-submit 运行你的火花工作,那么你至少有两个选择:

  • 提供 - jar 选项以指定mysql - * .jar的路径(请参阅此post)(如果工作者和驱动程序都需要该类,请仔细查看 spark.executor.extraJavaOptions spark.driver.extraJavaOptions
  • 构建一个超级jar(胖罐),它将在您的应用程序jar中包含您的mysql- *类(请参阅此post

答案 2 :(得分:0)

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 \

其中,$POSTGRESQL_JAR_PATH$MYSQL_JAR_PATH应使用jar文件的hdfs路径设置。

希望这会有所帮助。

spark.executor.extraClassPath如果您在群集模式下运行它。 spark.driver.extraClassPath如果您在本地运行它。

我建议将两个选项设置为更安全的一面。

答案 3 :(得分:0)

您应该在提交火花作业时传递驱动程序jar,如下所示:

1) spark-submit --jars mysql-connector-java-5.1.39.jar以及传递时的其余参数

2)如果你只想尝试本地使用shell spark-shell --jars mysql-connector-java-5.1.39.jar

将驱动程序更新为您已有的驱动程序,并提供该

的绝对路径