pyspark mysql jdbc load Произошла ошибка при вызове o23.load Нет подходящего драйвера

Я использую образ докера sequenceiq / spark на моем Mac, чтобы изучить эти примеры искры, в процессе изучения я обновляю искру внутри этого образа до 1.6.1 согласно этот ответ, и ошибка возникла, когда я запускаю пример Simple Data Operations, здесь вот что случилось:

когда я запускаю df = sqlContext.read.format("jdbc").option("url",url).option("dbtable","people").load(), возникает ошибка, и полный стек с консолью pyspark выглядит следующим образом:

Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
16/04/12 22:45:28 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 1.6.1
      /_/

Using Python version 2.6.6 (r266:84292, Jul 23 2015 15:22:56)
SparkContext available as sc, HiveContext available as sqlContext.
>>> url = "jdbc:mysql://localhost:3306/test?user=root;password=myPassWord"
>>> df = sqlContext.read.format("jdbc").option("url",url).option("dbtable","people").load()
16/04/12 22:46:05 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
16/04/12 22:46:06 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
16/04/12 22:46:11 WARN ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0
16/04/12 22:46:11 WARN ObjectStore: Failed to get database default, returning NoSuchObjectException
16/04/12 22:46:16 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
16/04/12 22:46:17 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/spark/python/pyspark/sql/readwriter.py", line 139, in load
    return self._df(self._jreader.load())
  File "/usr/local/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__
  File "/usr/local/spark/python/pyspark/sql/utils.py", line 45, in deco
    return f(*a, **kw)
  File "/usr/local/spark/python/lib/py4j-0.9-src.zip/py4j/protocol.py", line 308, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o23.load.
: java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:278)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$2.apply(JdbcUtils.scala:50)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$2.apply(JdbcUtils.scala:50)
    at scala.Option.getOrElse(Option.scala:120)
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.createConnectionFactory(JdbcUtils.scala:49)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:120)
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:91)
    at org.apache.spark.sql.execution.datasources.jdbc.DefaultSource.createRelation(DefaultSource.scala:57)
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:158)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:119)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381)
    at py4j.Gateway.invoke(Gateway.java:259)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:209)
    at java.lang.Thread.run(Thread.java:744)

>>>

Вот что я пробовал до сих пор:

  1. Загрузите mysql-connector-java-5.0.8-bin.jar и вставьте его в /usr/local/spark/lib/. Это все та же ошибка.

  2. Создайте t.py вот так:

    from pyspark import SparkContext  
    from pyspark.sql import SQLContext  
    
    sc = SparkContext(appName="PythonSQL")  
    sqlContext = SQLContext(sc)  
    df = sqlContext.read.format("jdbc").option("url",url).option("dbtable","people").load()  
    
    df.printSchema()  
    countsByAge = df.groupBy("age").count()  
    countsByAge.show()  
    countsByAge.write.format("json").save("file:///usr/local/mysql/mysql-connector-java-5.0.8/db.json")  
    

затем я попробовал spark-submit --conf spark.executor.extraClassPath=mysql-connector-java-5.0.8-bin.jar --driver-class-path mysql-connector-java-5.0.8-bin.jar --jars mysql-connector-java-5.0.8-bin.jar --master local[4] t.py. Результат все тот же.

  1. Затем я попробовал pyspark --conf spark.executor.extraClassPath=mysql-connector-java-5.0.8-bin.jar --driver-class-path mysql-connector-java-5.0.8-bin.jar --jars mysql-connector-java-5.0.8-bin.jar --master local[4] t.py, как со следующим t.py, так и без него, все то же самое.

Во время всего этого mysql работает. И вот моя информация об ОС:

# rpm --query centos-release  
centos-release-6-5.el6.centos.11.2.x86_64

А версия hadoop - 2.6.

Теперь я не знаю, куда идти дальше, поэтому я надеюсь, что кто-нибудь может помочь дать несколько советов, спасибо!


person shellbye    schedule 13.04.2016    source источник


Ответы (2)


Я столкнулся с «java.sql.SQLException: Нет подходящего драйвера», когда попытался записать свой сценарий в MySQL.

Вот что я сделал, чтобы это исправить.

В script.py

df.write.jdbc(url="jdbc:mysql://localhost:3333/my_database"
                  "?user=my_user&password=my_password",
              table="my_table",
              mode="append",
              properties={"driver": 'com.mysql.jdbc.Driver'})

Затем я запустил искру-отправить таким образом

SPARK_HOME=/usr/local/Cellar/apache-spark/1.6.1/libexec spark-submit --packages mysql:mysql-connector-java:5.1.39 ./script.py

Обратите внимание, что SPARK_HOME зависит от места установки Spark. Для вашей среды это https://github.com/sequenceiq/docker-spark/blob/master/README.md может помочь.

Если все вышеперечисленное сбивает с толку, попробуйте следующее:
В t.py замените

sqlContext.read.format("jdbc").option("url",url).option("dbtable","people").load()

с участием

sqlContext.read.format("jdbc").option("dbtable","people").option("driver", 'com.mysql.jdbc.Driver').load()

И запустите это с

spark-submit --packages mysql:mysql-connector-java:5.1.39 --master local[4] t.py
person aristide-n    schedule 24.05.2016
comment
Большое спасибо! - person shellbye; 27.05.2016
comment
возможно ли как-то установить эти --packages при запуске его внутри PyCharm в качестве обычного файла .py без spark-submit, потому что я хочу отлаживать его в среде IDE. spark.setConf (spark.jars.packages, mysql: mysql-connector-java: 5.1.40) с SPARK_HOME / lib containg jar не работает - person fpopic; 20.09.2017
comment
Спасибо! Я смог заставить это работать, используя флаг --jars вместо --packages в моей команде отправки. Например: --jars /usr/share/java/mysql-connector-java.jar - person vertigokidd; 07.10.2017

Я решил это с помощью следующей команды

import findspark
findspark.add_packages('mysql:mysql-connector-java:8.0.11')
person juanjosegdoj    schedule 07.09.2020