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

时间:2016-05-12 08:54:43

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

我在使用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服务时,我得到了org.postgresql.Driver的ClassNotFoundException

3 个答案:

答案 0 :(得分:1)

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

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

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

在本地,它在类路径中有bcoz postgres jar。

答案 1 :(得分:1)

使用命令

创建程序集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 submit,请使用此命令

./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(阵列( “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)
................................

答案 2 :(得分: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 flag指示的所有jar上传到服务器,所以你应该把你要使用的任何库jar放在你的情况下(postgresql-9.1-901-1.jdbc4.jar)并指定你的应用程序jar将在后面的参数application / spark-sample.jar

中运行

谢谢,

查尔斯。