在 Bluemix Apache-Spark 服务上运行的 Spark 应用程序中连接到 postgresql db

Posted

技术标签:

【中文标题】在 Bluemix Apache-Spark 服务上运行的 Spark 应用程序中连接到 postgresql db【英文标题】:Connecting to postgresql db in Spark application running on the Bluemix Apache-Spark service 【发布时间】: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

【问题讨论】:

【参考方案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)
................................

【讨论】:

以上是关于在 Bluemix Apache-Spark 服务上运行的 Spark 应用程序中连接到 postgresql db的主要内容,如果未能解决你的问题,请参考以下文章

Django 应用程序部署@Bluemix,其中 postgresql 不能作为服务使用

bluemix 服务单页应用程序

在 bluemix 上使用 python 调用服务

bluemix 服务器在 MySQL 中给出 SQLGrammarException

Apache-Spark 作为日志存储

解析服务器迁移到 IBM bluemix