gpt4 book ai didi

java - Apache 飞艇/ Spark : Why can't I access a remote DB with this code sample

转载 作者:行者123 更新时间:2023-11-30 10:47:24 25 4
gpt4 key购买 nike

我正在使用 Spark 和 Zeppelin 执行自己的第一步,但不明白为什么此代码示例不起作用。

第一 block :

%dep
z.reset() // clean up
z.load("/data/extraJarFiles/postgresql-9.4.1208.jar") // load a jdbc driver for postgresql

第二 block

%spark
// This code loads some data from a PostGreSql DB with the help of a JDBC driver.
// The JDBC driver is stored on the Zeppelin server, the necessary Code is transfered to the Spark Workers and the workers build the connection with the DB.
//
// The connection between table and data source is "lazy". So the data will only be loaded in the case that an action need them.
// With the current script means this the DB is queried twice. ==> Q: How can I keep a RDD in Mem or on disk?

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.rdd.JdbcRDD
import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet

import org.apache.spark.sql.hive._
import org.apache.spark.sql._

val url = "jdbc:postgresql://10.222.22.222:5432/myDatabase"
val username = "postgres"
val pw = "geheim"

Class.forName("org.postgresql.Driver").newInstance // activating the jdbc driver. The jar file was loaded inside of the %dep block


case class RowClass(Id:Integer, Col1:String , Col2:String) // create a class with possible values

val myRDD = new JdbcRDD(sc, // SparkContext sc
() => DriverManager.getConnection(url,username,pw), // scala.Function0<java.sql.Connection> getConnection
"select * from tab1 where \"Id\">=? and \"Id\" <=? ", // String sql Important: we need here two '?' for the lower/upper Bounds vlaues
0, // long lowerBound = start value
10000, // long upperBound, = end value that is still included
1, // int numPartitions = the area is spitted into x sub commands.
// e.g. 0,1000,2 => first cmd from 0 ... 499, second cmd from 500..1000
row => RowClass(row.getInt("Id"),
row.getString("Col1"),
row.getString("Col2"))
)

myRDD.toDF().registerTempTable("Tab1")

// --- improved methode (not working at the moment)----
val prop = new java.util.Properties
prop.setProperty("user",username)
prop.setProperty("password",pw)

val tab1b = sqlContext.read.jdbc(url,"tab1",prop) // <-- not working

tab1b.show

那么问题是什么。

我想连接到外部 PostgreSql 数据库。

block I 正在为数据库添加必要的 JAR 文件,第二个 block 的第一行已经在使用 JAR,它能够从数据库中获取一些数据。

但是第一种方式比较丑陋,因为你必须自己将数据转换成表格,所以我想在脚本末尾使用更简单的方法。

但是我收到了错误信息

java.sql.SQLException: No suitable driver found for jdbc:postgresql://10.222.22.222:5432/myDatabase

但它是与上述代码相同的 URL/相同的登录名/相同的 PW。为什么这不起作用?

也许有人对我有帮助的提示。

---- 更新:24.3。 12:15 ---

我不认为 JAR 的加载不起作用。我添加了一个额外的 val db = DriverManager.getConnection(url, username, pw); 用于测试。 (在异常内部失败的函数)这很好用。

另一个有趣的细节。如果我删除 %dep block 和类行,则会在第一个 block 中产生一个非常相似的错误。相同的错误信息;相同的函数+失败的行号,但函数堆栈有点不同。

我在这里找到了源代码:http://code.metager.de/source/xref/openjdk/jdk8/jdk/src/share/classes/java/sql/DriverManager.java

我的问题在第 689 行。所以如果所有参数都正常,可能它来自 isDriverAllowed() 检查?

最佳答案

我在 Zeppelin 中遇到了与依赖项相同的问题,我不得不将我的 jar 添加到 zeepelin-env.sh 中的 SPARK_SUBMIT_OPTIONS 以将它们包含在所有笔记本和段落中

因此,在 zeppelin-env.sh 中,您将 SPARK_SUBMIT_OPTIONS 修改为:

export SPARK_SUBMIT_OPTIONS="--jars/data/extraJarFiles/postgresql-9.4.1208.jar

然后你必须重启你的 zeppelin 实例。

关于java - Apache 飞艇/ Spark : Why can't I access a remote DB with this code sample,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36176620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com