Драйвер MySQL не найден для программы Scala

#mysql #scala #apache-spark #jdbc

#mysql #scala #apache-spark #jdbc

Вопрос:

Я новичок в Scala, пытаюсь использовать Spark для чтения из базы данных mysql. Что бы я ни делал, я сталкиваюсь с исключением «класс не найден». Я пытался подключиться без Spark, используя Squeryl, Scalike и т.д. Всегда одна и та же проблема. Вот один пример, который я попробовал :

 logger.info("Write part")

val dataframe_mysql = spark.sqlContext
  .read.format("jdbc")
  .option("url", s"jdbc:mysql://${datamart_server}:3306/vol")
  .option("driver", "com.mysql.jdbc.Driver")
  .option("dbtable", "company")
  .option("user", datamart_user).option("password", datamart_pwd)
  .load()

dataframe_mysql.show()
  

Я попытался поместить имя класса драйвера в src/main/resources/application.conf:

 db.default.driver="com.mysql.jdbc.Driver"
  

Но это не помогло. У меня есть :

Исключение java.sql.SQLException: нет подходящего драйвера

Я также делюсь файлом sbt, чтобы показать, как я добавляю зависимости :

 name := "commercial-api-datamart-feed"
version := "0.1"
scalaVersion := "2.11.6"
libraryDependencies  = "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.0"
libraryDependencies  = "ch.qos.logback" % "logback-classic" % "1.1.3" % Runtime
libraryDependencies  = "com.typesafe.scala-logging" %% "scala-logging" % "3.9.0"
libraryDependencies  = "org.apache.spark" %% "spark-core" % "2.3.0"
libraryDependencies  = "org.apache.spark" %% "spark-sql" % "2.3.0"
libraryDependencies  = "mysql" % "mysql-connector-java" % "5.1.24" % Runtime
  

Spark не является обязательным, но я думаю, что это лучше для производительности.

Ответ №1:

Как вы запускаете этот код? Вам нужно будет передать MySQL JAR как --jars ; что-то вроде --jars /path/to/mysql.jar при запуске spark-shell или spark-submit .

Если вы предпочитаете запускать один JAR, вам нужно убедиться, что MySQL JAR встроен как часть вашего uber JAR. Я никогда не использовал SBT, но вам нужно будет проверить, содержит ли созданный в конечном итоге JAR классы MySQL внутри него — если нет, используйте соответствующие флаги SBT, чтобы это произошло.

Комментарии:

1. Вы правы. Я использую spark-submit, и jar не включает драйвер mysql. (Однако он не включает другие зависимости, так почему только драйвер mysql?). Итак, теперь, когда я добавляю предложенный вами параметр, он работает. У меня все еще есть проблема с использованием addSbtPlugin (чтобы найти правильную версию для scala 2.11), но я думаю, что я должен задать это как другой вопрос. Спасибо!

2. @IoriYagami AFAIK, причина, по которой это работает для других JAR ( spark-sql , spark-core ), заключается в том, что они уже являются частью пути к классам при запуске исполнителей / драйвера, учитывая, что они являются частью установки Spark. Вы должны увидеть такое же поведение для любых «неискровых» JAR, которые использует ваше приложение. Если нет, это было бы очень удивительно.

Ответ №2:

Вы должны убедиться, что зависимости mysql существуют для всех исполнителей. В моей среде я использую maven и указываю зависимость, подобную этой, внутри моего pom.xml :

 <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.42</version>
</dependency>
  

Затем я гарантирую, что эта зависимость включена в jar моего приложения (используя плагин maven shade), так что мне не нужно размещать jar на всех исполнителях.

Независимо от того, используете вы spark или нет для доступа mysql поверх jdbc , вам нужно убедиться, что он mysql-connector доступен на вашем classpath компьютере, откуда бы вы ни выполняли mysql запросы.

Комментарии:

1. Спасибо @Travis за комментарий. Извините, что я забыл включить свой файл sbt. Я обновляю сообщение.