#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. Я обновляю сообщение.