Ни одно подходящее исключение драйвера не работает во время работы над программой Spark-JDBC [дубликат]

... но я хочу прочитать содержимое с фиксированного пути

Вы не можете, а не в веб-браузере, использовать стандарты и получать доступ к локальному файлу система. Существует огромная разница между тем, чтобы браузер мог прочитать файл, который пользователь специально определил для этой страницы, и разрешить ему читать любой файл, который он хочет. Вы просто не можете делать последнее, не прибегая к механизмам (которые будут запускать элементы безопасности), такие как ActiveX, Flash, подписанные Java-апплеты и т. П. Файл API требует, чтобы в качестве отправной точки по какой-либо причине был создан файл input.

23
задан Keshav Pradeep Ramanath 29 August 2017 в 10:09
поделиться

8 ответов

С искрами 2.2.0 проблема была исправлена ​​для меня, добавив дополнительную информацию о пути пути для сеанса SparkSession в скрипте python:

    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 framework https://www.djangoproject.com/

1
ответ дан 06userit 15 August 2018 в 23:22
поделиться
  • 1
    Любая идея, если это будет работать при подаче задания на Amazon EMR? – Evan Zamir 13 March 2018 в 22:32

У этого человека была аналогичная проблема: 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.jdbc.Driver"); //here
DataFrame jdbcDF = sqlContext.load("jdbc", options); 

В искровом / conf / spark-defaults.conf вы также можете установить spark.driver.extraClassPath и spark.executor.extraClassPath на путь вашего драйвера MySql .jar

26
ответ дан Adrien Brunelat 15 August 2018 в 23:22
поделиться

Эти опции четко упоминаются в spark docs : --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

6
ответ дан Ayush Vatsyayan 15 August 2018 в 23:22
поделиться
  • 1
    Вы спасатель жизни. благодаря – biniam_Ethiopia 2 November 2017 в 19:23
  • 2
    Я строю uber-jar со всем классом водителя там. Должен ли я по-прежнему вручную предоставлять банку драйвера команду spark-submit? – Abhi 22 December 2017 в 18:49
  • 3
    Я предполагаю, что если вы предоставили мастер-банку, тогда все банки внутри нее должны быть доступны в classpath. Вы пробовали этот подход? – Ayush Vatsyayan 8 January 2018 в 09:12
  • 4
    Как вы это делаете правильно при отправке задания в EMR? – Evan Zamir 13 March 2018 в 22:31
  • 5
    Не работали над EMR - нужно проверить. – Ayush Vatsyayan 14 March 2018 в 08:53

У меня была одна и та же проблема с выполнением заданий над кластером Mesos в режиме кластера.

Чтобы использовать драйвер JDBC, необходимо добавить зависимость к пути к системному классу не к пути класса framework. Я нашел способ сделать это, добавив зависимость в файл spark-defaults.conf в каждом экземпляре кластера.

Добавляемые свойства: spark.driver.extraClassPath и spark.executor.extraClassPath, а путь должен находиться в локальной файловой системе.

1
ответ дан Daniel Carroza 15 August 2018 в 23:22
поделиться
  • 1
    Я пробовал все решения здесь, ничего не работает, я продолжаю получать «нет подходящего драйвера». ошибка. идеи? – thebeancounter 27 August 2017 в 13:44

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 должен быть видимым для первичного класс загрузчика на сеансе клиента и всех исполнителей. Это связано с тем, что класс DriverManager Java выполняет проверку безопасности, в результате чего он игнорирует все драйверы, которые не видны первоклассному загрузчику классов, когда вы открываете соединение. Один из удобных способов сделать это - изменить compute_classpath.sh на всех рабочих узлах, чтобы включить JAR для драйверов.

6
ответ дан Gianmario Spacagna 15 August 2018 в 23:22
поделиться

Оба драйвера искры и исполнитель нуждаются в драйвере mysql на пути к классу, поэтому укажите

spark.driver.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
spark.executor.extraClassPath = <path>/mysql-connector-java-5.1.36.jar
16
ответ дан jozh 15 August 2018 в 23:22
поделиться
  • 1
    Используя python, это решило проблему для меня – Sean 14 March 2016 в 02:29

Существует простой трюк 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)))

Проверьте документы

3
ответ дан Nikita 15 August 2018 в 23:22
поделиться
  • 1
    В Scala я использовал: новый JdbcRDD (sc, () = & gt; {Class.forName (driverName) .newInstance; DriverManager.getConnection (url, user, password)}, & quot; SELECT * FROM stats_20151230 & quot ;, 0, 0, 1 ) Благодаря! – beloblotskiy 5 January 2016 в 19:34

Я добавляю файл 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
1
ответ дан Robin Wang 15 August 2018 в 23:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: