Spark Не удалось найти драйвер JDBC
Итак, я использовал sbt с сборкой для упаковки всех моих зависимостей в одну банку для моих искровых заданий. У меня есть несколько заданий, в которых я использовал c3p0
, чтобы настроить информацию пула соединений, транслировать это, а затем использовать foreachPartition
в RDD, чтобы затем захватить соединение и вставить данные в базу данных. В моей sbt build script я включаю
"mysql" % "mysql-connector-java" % "5.1.33"
Это гарантирует, что разъем JDBC упакован с заданием. Все отлично работает.
Так недавно я начал играть с SparkSQL и понял, что гораздо проще просто взять фрейм данных и сохранить его в источнике jdbc с новыми функциями в 1.3.0
Я получаю следующее исключение:
java.sql.SQLException: не найдено подходящего драйвера для jdbc: mysql://some.domain.com/myschema? user = user & password = password at java.sql.DriverManager.getConnection(DriverManager.java:596) в java.sql.DriverManager.getConnection(DriverManager.java:233)
Когда я запускал это локально, я обошел его, установив
SPARK_CLASSPATH=/path/where/mysql-connector-is.jar
В конечном итоге то, что я хочу знать, это то, почему работа не способна найти драйвер, когда он должен быть упакован с ним? У моей другой работы никогда не было этой проблемы. Из того, что я могу сказать как c3p0
, так и кода dataframe, оба используют java.sql.DriverManager
(который обрабатывает импорт для вас всего, что я могу сказать), поэтому он должен работать нормально? Если что-то препятствует работе метода сборки, что мне нужно сделать, чтобы сделать эту работу?
Ответы
Ответ 1
У этого человека была похожая проблема: http://apache-spark-user-list.1001560.n3.nabble.com/How-to-use-DataFrame-with-MySQL-td22178.html
Вы обновили драйверы разъема до последней версии? Также вы указали класс драйвера, когда вызывали load()?
Map<String, String> options = new HashMap<String, String>();
options.put("url", "jdbc:mysql://localhost:3306/video_rcmd?user=root&password=123456");
options.put("dbtable", "video");
options.put("driver", "com.mysql.cj.jdbc.Driver"); //here
DataFrame jdbcDF = sqlContext.load("jdbc", options);
В spark/conf/spark-defaults.conf вы также можете установить spark.driver.extraClassPath и spark.executor.extraClassPath в путь вашего драйвера MySql.jar
Ответ 2
Как для искрового драйвера, так и для исполнителя нужен драйвер mysql в пути класса, поэтому укажите
spark.driver.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
spark.executor.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
Ответ 3
Эти параметры четко упоминаются в документах spark: --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar
Ошибка, которую я делал, заключалась в том, что я упоминал эти варианты после своей аппликации.
Однако правильный способ - указать эти параметры сразу после spark-submit:
spark-submit --driver-class-path/somepath/project/mysql-connector-java-5.1.30-bin.jar --jars/somepath/project/mysql-connector-java-5.1.30-bin.jar --class com.package.MyClass target/scala-2.11/project_2.11-1.0.jar
Ответ 4
spark.driver.extraClassPath не работает в клиентском режиме:
Примечание. В режиме клиента эта конфигурация не должна устанавливаться через SparkConf непосредственно в вашем приложении, так как JVM драйвера уже запущен в этой точке. Вместо этого установите это через параметр командной строки -driver-class-path или в файл свойств по умолчанию.
Env переменная SPARK_CLASSPATH устарела в Spark 1.0 +.
Сначала вы должны скопировать jdbc-драйвер jars в каждый исполнитель в рамках одного и того же пути к локальной файловой системе, а затем использовать следующие параметры в spark-submit:
--driver-class-path "driver_local_file_system_jdbc_driver1.jar:driver_local_file_system_jdbc_driver2.jar"
--class "spark.executor.extraClassPath=executors_local_file_system_jdbc_driver1.jar:executors_local_file_system_jdbc_driver2.jar"
Например, в случае TeraData вам нужны как terajdbc4.jar, так и tdgssconfig.jar.
Альтернативно изменить compute_classpath.sh на всех рабочих узлах, в документации Spark говорится:
Класс драйвера JDBC должен быть видимым для начального загрузчика классов на сеансе клиента и для всех исполнителей. Это связано с тем, что класс Javas DriverManager выполняет проверку безопасности, в результате чего он игнорирует все драйверы, которые не видны первоклассному загрузчику классов, когда вы открываете соединение. Один из удобных способов сделать это - изменить compute_classpath.sh на всех рабочих узлах, чтобы включить JAR драйверов.
Ответ 5
С искрой 2.2.0 проблема была исправлена для меня, добавив дополнительную информацию о пути пути для сеанса SparkSession в python script:
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.driver.extraClassPath", "/path/to/jdbc/driver/postgresql-42.1.4.jar") \
.getOrCreate()
См. официальную документацию https://spark.apache.org/docs/latest/configuration.html
В моем случае искра не запускается из команды cli, а из рамки django https://www.djangoproject.com/
Ответ 6
Существует простой трюк Java для решения вашей проблемы. Вы должны указать экземпляр Class.forName()
. Например:
val customers: RDD[(Int, String)] = new JdbcRDD(sc, () => {
Class.forName("com.mysql.jdbc.Driver")
DriverManager.getConnection(jdbcUrl)
},
"SELECT id, name from customer WHERE ? < id and id <= ?" ,
0, range, partitions, r => (r.getInt(1), r.getString(2)))
Проверьте docs
Ответ 7
У меня была такая же проблема, что и работа над кластером Mesos в кластерном режиме.
Чтобы использовать JDBC-драйвер, необходимо добавить зависимость к пути к системному классу не к пути класса framework. Я только нашел способ сделать это, добавив зависимость в файле spark-defaults.conf
в каждом экземпляре кластера.
Добавляемые свойства: spark.driver.extraClassPath
и spark.executor.extraClassPath
, и путь должен находиться в локальной файловой системе.
Ответ 8
Я добавляю файл jar в SPARK_CLASSPATH в spark-env.sh, он работает.
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/local/spark-1.6.3-bin-hadoop2.6/lib/mysql-connector-java-5.1.40-bin.jar
Ответ 9
Я столкнулся с той же проблемой, когда пытался запустить команду spark-shell с моего компьютера с Windows. Путь, который вы передаете для местоположения драйвера, а также для фляги, которую вы будете использовать, должен быть в двойных кавычках, иначе он будет неверно истолкован, и вы не получите точный вывод, который вы хотите.
Вам также необходимо установить драйвер JDBC для сервера SQL по ссылке: Драйвер JDBC
Я использовал приведенную ниже команду для этого, чтобы нормально работать на моем компьютере с Windows:
spark-shell --driver-class-path "C:\Program Files\Microsoft JDBC Driver 6.0 для SQL Server\sqljdbc_6.0\enu\jre8\sqljdbc42.jar" --jars "C:\Program Files\Microsoft JDBC Driver 6.0 для SQL Server\sqljdbc_6.0\enu\jre8\sqljdbc42.jar "