Spark SQL - PostgreSQL JDBC 类路径问题

Posted

技术标签:

【中文标题】Spark SQL - PostgreSQL JDBC 类路径问题【英文标题】:Spark SQL - PostgreSQL JDBC Classpath Issues 【发布时间】:2015-05-13 17:33:32 【问题描述】:

我在将 Spark SQL 连接到 PostgreSQL 数据源时遇到问题。我已经下载了 Postgres JDBC jar 并使用 sbt-assembly 将它包含在一个 uber jar 中。

我的(失败的)源代码: https://gist.github.com/geowa4/a9bc238ca7c372b95267.

我也尝试过在classOf[org.postgresql.Driver] 之前使用sqlContext.jdbc()。看来驱动程序可以正常访问驱动程序。

任何帮助将不胜感激。谢谢。

SimpleApp.scala:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext

object SimpleApp 
  def main(args: Array[String]) 
    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._
    val commits = sqlContext.load("jdbc", Map(
      "url" -> "jdbc:postgresql://192.168.59.103:5432/postgres",
      "dbtable" -> "commits",
      "driver" -> "org.postgresql.Driver"))
    commits.select("message").show(1)
  

simple.sbt:

name := "simple-project"

version := "1.0"

scalaVersion := "2.11.6"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.3.1" % "provided"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.3.1" % "provided"
libraryDependencies += "org.postgresql" % "postgresql" % "9.4-1201-jdbc41"

输出(已编辑):

Exception in thread "main" java.lang.ClassNotFoundException: org.postgresql.Driver
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:102)
        at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:219)
        at org.apache.spark.sql.SQLContext.load(SQLContext.scala:697)
        at SimpleApp$.main(SimpleApp.scala:17)
        at SimpleApp.main(SimpleApp.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

编辑:我将 Scala 版本更改为 2.10.5,输出更改为此。我觉得我在进步。

【问题讨论】:

我认为我的问题可能是我使用 Scala 2.11 进行编译。 spark.apache.org/docs/latest/… 不,这让我遇到了另一个错误,这似乎是一个类路径问题。 【参考方案1】:

JDBC 的一般问题存在问题,原始类加载器必须知道 jar。在 Spark 1.3 中,可以使用SPARK_CLASSPATH 选项解决此问题,如下所述: https://spark.apache.org/docs/1.3.0/sql-programming-guide.html#jdbc-to-other-databases

在 Spark 1.4 中,这应该由 #5782 修复。

【讨论】:

感谢您的回复;很高兴看到这将很快得到解决。我想如果我制作一个包含 PostgreSQL 驱动程序的 uber-jar,我会避免这个问题。 我能够使用以下命令使其在本地工作:sbt packagespark-submit --driver-class-path ~/.m2/repository/org/postgresql/postgresql/9.3-1102-jdbc41/postgresql-9.3-1102-jdbc41.jar target/scala-2.10/simple-project_2.10-1.0.jar 。再次感谢。【参考方案2】:

1) 将文件复制到您的 jar 位置

2) 在路径中添加jar如下

spark-submit    --jars /usr/share/java/postgresql-jdbc.jar    --class com.examples.WordCount  .. .. ..

【讨论】:

以上是关于Spark SQL - PostgreSQL JDBC 类路径问题的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - PostgreSQL JDBC 类路径问题

在 jupyter 中运行 spark.sql 查询

在 org.apache.spark.sql.types.DataTypes 中找不到 uuid

如何在 Spark SQL 中启用 Postgis 查询

spark2.0 连接mysql8.0数据库操作表数据

Spark SQL 中的 ARRAY_TO_STRING