Apache Spark:JDBC连接无法正常工作

时间:2015-04-23 11:03:06

标签: postgresql jdbc apache-spark apache-spark-sql

我之前也问过这个问题,但没有得到任何答案(Not able to connect to postgres using jdbc in pyspark shell)。

我已在本地Windows上成功安装Spark 1.3.0并运行示例程序以使用pyspark shell进行测试。

现在,我想对存储在Postgresql中的数据运行Mllib的Correlations,但是我无法连接到postgresql。

我已经通过运行

在类路径中成功添加了所需的jar(测试过这个jar)
pyspark --jars "C:\path\to\jar\postgresql-9.2-1002.jdbc3.jar"

我可以看到jar已成功添加到环境UI中。

当我在pyspark shell中运行以下内容时 -

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[host]/[dbname]", dbtable="[schema.table]")  

我得到了这个错误 -

>>> df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[host]/[dbname]", dbtable="[schema.table]")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\pyspark\sql\context.py", line 482, in load
    df = self._ssql_ctx.load(source, joptions)
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip\py4j\java_gateway.py", line 538, in __call__
  File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip\py4j\protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o20.load.
: java.sql.SQLException: No suitable driver found for     jdbc:postgresql://[host]/[dbname]
        at java.sql.DriverManager.getConnection(DriverManager.java:602)
        at java.sql.DriverManager.getConnection(DriverManager.java:207)
        at org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:94)
        at org.apache.spark.sql.jdbc.JDBCRelation.<init>    (JDBCRelation.scala:125)
        at  org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:114)
        at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:290)
        at org.apache.spark.sql.SQLContext.load(SQLContext.scala:679)
        at org.apache.spark.sql.SQLContext.load(SQLContext.scala:667)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
        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:207)
        at java.lang.Thread.run(Thread.java:619)

6 个答案:

答案 0 :(得分:11)

我遇到了mysql / mariadb的这个问题,从this question获得了大量的线索

所以你的pyspark命令应该是:

pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>

当pyspark开始时也要注意错误&#34;警告:本地jar ...不存在,跳过。&#34;并且&#34;错误SparkContext:Jar找不到...&#34;,这些可能意味着你拼写错误的路径。

答案 1 :(得分:3)

稍微优雅的解决方案:

val props = new Properties
props.put("driver", "org.postgresql.Driver")
sqlContext.read.jdbc("jdbc:postgresql://[host]/[dbname]", props)

答案 2 :(得分:2)

正如jake256所说

  

“driver”,“org.postgresql.Driver”

键值对丢失了。就我而言,我发起了 pyspark

pyspark --jars /path/to/postgresql-9.4.1210.jar

按照以下说明操作:

  from pyspark.sql import DataFrameReader

  url = 'postgresql://192.168.2.4:5432/postgres'
  properties = {'user': 'myUser', 'password': 'myPasswd', 'driver': 'org.postgresql.Driver'}
  df = DataFrameReader(sqlContext).jdbc(
      url='jdbc:%s' % url, table='weather', properties=properties
  )
  df.show()

  +-------------+-------+-------+-----------+----------+
  |         city|temp_lo|temp_hi|       prcp|      date|
  +-------------+-------+-------+-----------+----------+
  |San Francisco|     46|     50|       0.25|1994-11-27|
  |San Francisco|     43|     57|        0.0|1994-11-29|
  |      Hayward|     54|     37|0.239999995|1994-11-29|
  +-------------+-------+-------+-----------+----------+

经过测试:

  • Ubuntu 16.04

  • PostgreSQL服务器版本9.5。

  • 使用的Postgresql驱动程序是postgresql-9.4.1210.jar

  • 和Spark版本是spark-2.0.0-bin-hadoop2.6

  • 但我也相信它也应该继续努力 火花2.0.0彬hadoop2.7。

  • Java JDK 1.8 64位

可以在以下位置找到其他JDBC驱动程序: https://www.petefreitag.com/articles/jdbc_urls/

我接下来的教程是: https://developer.ibm.com/clouddataservices/2015/08/19/speed-your-sql-queries-with-spark-sql/

类似的解决方案也建议: pyspark mysql jdbc load An error occurred while calling o23.load No suitable driver

答案 3 :(得分:1)

当您使用错误版本的JDBC驱动程序时,似乎会抛出此错误。检查https://jdbc.postgresql.org/download.html以确保您拥有正确的密码。

特别注意:

  

JDK 1.1 - JDBC 1.注意,使用8.0发行版的JDBC 1支持   已删除,因此请在更新服务器时更新JDK。

     

JDK 1.2,1.3 - JDBC 2. JDK 1.3 + J2EE - JDBC 2 EE。这包含   对javax.sql类的额外支持。

     

JDK 1.4,1.5 - JDBC 3.它包含对SSL和javax.sql的支持,但不需要J2EE,因为它已添加到J2SE版本中。 JDK 1.6 - JDBC4。对JDBC4方法的支持并不完整,但大多数方法都已实现。

     

JDK 1.7,1.8 - JDBC41。不支持JDBC4方法   完成,但大多数方法都已实施。

答案 4 :(得分:0)

请看这篇文章,只需在所有选项后放置脚本。 see this

答案 5 :(得分:-1)

这非常简单。要连接到外部数据库以将数据检索到Spark数据帧,需要其他jar文件。例如。使用MySQL需要JDBC驱动程序。下载驱动程序包并从可从群集中的每个节点访问的路径中提取mysql-connector-java-x.yy.zz-bin.jar。优选地,这是共享文件系统上的路径。例如。使用Pouta虚拟集群这样的路径将在/ shared_data下,这里我使用/ shared_data / thirdparty_jars /.

使用来自终端1的直接Spark作业提交,可以指定-driver-class-path参数,该参数指向应该为具有该作业的工作人员提供的额外jar。但是这不适用于这种方法,因此我们必须在spark-defaults.conf文件中为前端和工作节点配置这些路径,通常在/ opt / spark / conf目录中。

spark.driver.extraClassPath /"your-path"/mysql-connector-java-5.1.35-bin.jar spark.executor.extraClassPath /&#34; your-path&#34; /mysql-connector-java-5.1.35-bin.jar