Подтвердить что ты не робот

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 (который обрабатывает импорт для вас всего, что я могу сказать), поэтому он должен работать нормально? Если что-то препятствует работе метода сборки, что мне нужно сделать, чтобы сделать эту работу?

4b9b3361

Ответ 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 "