在 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 不能作为服务使用