Apache-Zeppelin / Spark: почему я не могу получить доступ к удаленной БД с этим примером кода
Я делаю свои первые шаги с Spark и Zeppelin и не понимаю, почему этот пример кода не работает.
Первый Блок:
%dep
z.reset() // clean up
z.load("/data/extraJarFiles/postgresql-9.4.1208.jar") // load a jdbc driver for postgresql
Второй Блок
%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.
Блок I добавляет необходимый JAR-файл для БД, и первые строки второго блока уже используют JAR, и он может получить некоторые данные из БД.
Но первый способ уродлив, потому что вам нужно самостоятельно преобразовать данные в таблицу, поэтому я хочу использовать более простой метод в конце скрипта.
Но я получаю сообщение об ошибке
java.sql.SQLException: не найден подходящий драйвер для jdbc:postgresql://10.222.22.222:5432/myDatabase
Но это тот же URL / тот же логин / тот же PW из приведенного выше кода. Почему это не работает?
Может быть, у кого-нибудь есть полезная подсказка для меня.
---- Обновление: 24,3. 12:15 ---
Я не думаю, что загрузка JAR не работает. Я добавил дополнительный val db = DriverManager.getConnection(url, username, pw);
для тестирования. (Функция, которая не работает внутри исключения) И это хорошо работает.
Еще одна интересная деталь. Если я удаляю блок% dep и строку класса, выдает первый блок очень похожую ошибку. То же сообщение об ошибке; та же самая функция + номер строки, которая терпит неудачу, но стек функций немного отличается.
Я нашел исходный код здесь: http://code.metager.de/source/xref/openjdk/jdk8/jdk/src/share/classes/java/sql/DriverManager.java
Моя проблема в строке 689. Так что, если все параметры в порядке, возможно, это происходит из isDriverAllowed()
проверять?
2 ответа
У меня была та же проблема с зависимостями в Zeppelin, и мне пришлось добавить свои jar-файлы в SPARK_SUBMIT_OPTIONS в zeepelin-env.sh, чтобы они были включены во все блокноты и абзацы
Так что в zeppelin-env.sh вы изменяете SPARK_SUBMIT_OPTIONS так, чтобы:
export SPARK_SUBMIT_OPTIONS="--jars /data/extraJarFiles/postgresql-9.4.1208.jar
Затем вы должны перезапустить свой экземпляр Zeppelin.
В моем случае при выполнении кода spark/scala я получил ту же ошибку. Ранее я установил SPARK_CLASSPATH в моем conf-файле spark-env.sh - он указывал на файл jar. Я удалил / закомментировал строку в spark-env.sh и перезапустил zepplin. Это избавило от ошибки.