我在使用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
答案 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
中运行谢谢,
查尔斯。