【问题标题】:Apache Spark : JDBC connection not workingApache Spark:JDBC 连接不工作
【发布时间】:2015-07-01 12:35:50
【问题描述】:

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

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

现在,我想从 Mllib 对存储在 Postgresql 中的数据运行 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)

【问题讨论】:

  • 绝对重复!它是由同一用户发布的!
  • 是的,它是重复的.. 这是更详细的版本。请帮帮我。
  • 你不应该重复发布。如果有的话,您应该更新旧版本以包含更多信息。
  • 好的..注意,不会再这样做了...但是除了投票和提醒我不应该这样做之外,任何人都可以在这里帮助我。

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


【解决方案1】:

我在 mysql/mariadb 上遇到了这个确切的问题,并从 this question 获得了大线索

所以你的 pyspark 命令应该是:

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

当 pyspark 启动时,还要注意“警告:本地 jar ... 不存在,正在跳过”之类的错误。和“ERROR SparkContext: Jar not found at ...”,这些可能意味着你拼错了路径。

【讨论】:

  • 嘿,你能解释一下各种标志吗?我是 Spark 的新手,为了让它与 phoenix table 一起工作,我付出了很多努力。 master的意思是phoenix的主机地址吗?我在哪里可以找到 jdbc.jar?
  • Spark 文档中包含所有标志的综合文档。当前版本的“配置”页面(记录这些标志等等)在这里:spark.apache.org/docs/latest/configuration.html
  • 有效! spark 1.6.1中只需要--driver-class-path
  • 如果在集群上运行,则需要 --jars,以便每个节点都获取 jdbc jar(除非它是在每个主机上手动安装的)。如果你在单个节点上运行 spark,那么你不需要 --jars
【解决方案2】:

稍微优雅一点的解决方案:

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

【讨论】:

    【解决方案3】:

    按照 jake256 的建议

    “驱动程序”、“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

    • 但我也相信它也应该适用于 spark-2.0.0-bin-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

    【讨论】:

      【解决方案4】:

      当您使用错误版本的 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 方法 完成,但大部分方法都实现了。

      【讨论】:

      • 不,当classpath上没有加载接受JDBC url的驱动时返回此错误,因为JDBC url正常,说明驱动没有加载。 JDBC 2 或 3 驱动程序通常会在较新的 Java 版本下正常加载,这仅意味着较新的功能不可用。我知道的少数例外之一是 SQL Server 驱动程序,如果您的 JVM 版本错误,它将拒绝加载。但是请注意,使用更新的 JDBC 版本可能会解决问题,但这仅仅是因为 JDBC 4 中的驱动程序自动加载支持。
      【解决方案5】:

      请看这篇文章,把你的脚本放在所有选项之后。 see this

      【讨论】:

        【解决方案6】:

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

        通过从终端直接提交 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 /"your-path"/mysql-connector-java-5.1.35-bin.jar

        【讨论】:

          猜你喜欢
          • 2019-10-18
          • 2018-12-14
          • 2011-12-29
          • 2014-01-13
          • 2016-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多