【问题标题】:Connecting to postgresql db in Spark application running on the Bluemix Apache-Spark service在 Bluemix Apache-Spark 服务上运行的 Spark 应用程序中连接到 postgresql db
【发布时间】:2016-09-07 23:50:41
【问题描述】:

我在使用 spark-submit.sh 脚本在 Bluemix Apache-Spark 服务集群上启动的 Spark 应用程序中连接到我的 postgresql 数据库时遇到问题

我的 scala 文件代码是

val conf = new SparkConf().setAppName("My demo").setMaster("local")
 val sc = new SparkContext(conf)
 val sqlContext = new SQLContext(sc)
 val driver = "org.postgresql.Driver"
 val url = "jdbc:postgresql://aws-us-east-1-portal.16.dblayer.com:10394/tennisdb?user=***&password=***"
 println("create")
 try {
   Class.forName(driver)
   val jdbcDF = sqlContext.read.format("jdbc").options(Map("url" -> url, "driver" -> driver, "dbtable" -> "inputdata")).load()
   jdbcDF.show()
   println("success")
 } catch {
   case e : Throwable => {
     println(e.toString())
     println("Exception");
     }
 }
 sc.stop()

我正在使用 sbt 文件来解决依赖关系。 sbt文件的代码是:

 name := "spark-sample"

 version := "1.0"

 scalaVersion := "2.10.4"

 // Adding spark modules dependencies

 val sparkModules = List("spark-core",
   "spark-streaming",
   "spark-sql",
   "spark-hive",
   "spark-mllib",
   "spark-repl",
   "spark-graphx"
 )

 val sparkDeps = sparkModules.map( module => "org.apache.spark" % s"${module}_2.10" % "1.4.0" )     

 libraryDependencies ++= sparkDeps

 libraryDependencies += "org.postgresql" % "postgresql" % "9.4-1201-jdbc41"

然后我使用 sbt package 命令为我的应用程序创建一个 jar,以便在使用 Bluemix Apache-Spark 服务的集群上运行它。 jar 为我成功创建,应用程序在本地运行,没有任何错误。但是,当我使用 spark-submit.sh 脚本将应用程序提交到 Bluemix Apache-Spark 服务时,我得到了 ClassNotFoundException for org.postgresql.Driver

【问题讨论】:

    标签: postgresql scala apache-spark sbt ibm-cloud


    【解决方案1】:

    另一种简单的方法:- 只需将所有库文件放在应用程序 jar 所在的目录下,然后告诉 spark-submit.sh 查找即可。

    charles@localhost tweetoneanalyzer]$ spark-submit --jars $(echo application/*.jar | tr ' ' ',') --class "SparkTweets" --master local[3] application/spark-sample.罐子

    在上面的例子中, spark-submit 会将应用程序文件夹下由 --jars 标志指示的所有 jar 上传到服务器,因此您应该在您的情况下放置您将使用的任何库 jar(postgresql-9.1-901-1.jdbc4.jar)并指定您的在后面的参数 application/spark-sample.jar 中运行的应用程序 jar

    谢谢,

    查尔斯。

    【讨论】:

      【解决方案2】:

      您应该使用 sbt 程序集 来创建 jar 文件以在集群上运行它。

      sbt assembly 将为您的项目创建一个胖 JAR,其中包含它的所有依赖项,其中也包括 postgres。

      这是一个 CLASSPATH 问题; PostgreSQL JDBC 驱动程序在类加载器尝试加载它时不可用。

      在本地它可以工作在类路径中的 postgres jar 中

      【讨论】:

        【解决方案3】:

        使用命令创建你的程序集 jar 文件

           sbt assembly
        

        确保汇编文件包含 postgresql 驱动程序,如果不包含 把你的 postgresql-xxxx.jdbc4.jar 驱动放到你项目的 lib 目录中

          /myproject/lib/postgresql-9.1-901-1.jdbc4.jar
        

        然后重新创建

           sbt assembly
        

        在 hdfs 位置上传你的 jar 文件

         hdfs://assembly/myproject.jar
        

        如果您使用的是 spark 提交,请使用此命令

        ./bin/spark-submit \
        --class <main-class>
        --master <master-url> \
        hdfs://assembly/myproject.jar \
        

        在你的代码中配置你的 spark conf

        val conf = new SparkConf()
        .setMaster(sparkMasterUrl
        .setJars(Array("hdfs://assembly/myproject.jar"))
        

        并运行您的应用程序

        在您的情况下,添加汇编文件,例如 conf.setJars(Array("hdfs://assembly/myproject.jar"))

        val conf = new SparkConf().setAppName("My demo").setMaster("local")
        conf.setJars(Array("hdfs://assembly/myproject.jar"))
        val sc = new SparkContext(conf)
        val sqlContext = new SQLContext(sc)
        ................................
        

        【讨论】:

          猜你喜欢
          • 2016-04-26
          • 1970-01-01
          • 2016-06-09
          • 1970-01-01
          • 1970-01-01
          • 2016-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多