2016-04-13 3 views
3

Я использую Docker изображение sequenceiq/spark на моем Mac, чтобы изучить эти spark examples, в процессе исследования, обновить искру внутри этого образа в соответствии с 1.6.1 this answer и произошла ошибка, когда я начинаю Simple Data Operations пример, вот что случилось:pyspark JDBC для MySQL загрузки Ошибка при вызове не o23.load Нет подходящего драйвера

когда я бегу 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 как это:

    из pyspark импорта SparkContext
    из pyspark.sql импорта SQLContext

    СБН = SparkContext (APPNAME = "PythonSQL")
    sqlContext = SQLContext (СБН)
    df = sqlContext.read.format ("jdbc"). option ("url", url) .option ("dbtable", "people"). load()

    df.printSchema(). countsByAge = df.groupBy ("возраст") рассчитывать()
    countsByAge.show()
    countsByAge.write.format ("JSon") .save ("Файл: /// USR/местные/MySQL/MySQL-разъем-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 работает. И вот моя информация о os:

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

И версия hadoop 2.6.

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

ответ

4

Я столкнулся с «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 специфичен, где установлена ​​искра. Для вашей среды это может помочь 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 
+0

Спасибо вам много! – shellbye

+0

приветствуется @shellbye –

+0

Возможно ли как-то установить эти -пакеты во время работы внутри PyCharm как обычный .py-файл без искры-submit, потому что я хочу отлаживать его в среде IDE. spark.setConf ("spark.jars.packages", "mysql: mysql-connector-java: 5.1.40") с SPARK_HOME/lib containg jar не работает – fpopic