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. Это избавило от ошибки.

Другие вопросы по тегам