2015-06-24 1 views
2

Я пробовал много разных подходов к подключению к нашей среде Teradata от Apache Spark с использованием JDBC-соединения. Ниже приведен код, который я использовал.Соединение JDBC не удается подключить Teradata от искры apache

Я убедился, что мои драйверы JDBC верны, поскольку я использую одни и те же драйверы для подключения к Teradata с других платформ.

Я также добавление Баночки драйверов при работе искровой скорлупу ./bin/spark-shell --jars /home/path/*.jar --driver-class-path /home/path/*.jar

Любая помощь будет оценен по достоинству!

val jdbcDF = sqlContext.load("jdbc", Map(
    "url" -> "jdbc:teradata://<server_name>, TMODE=TERA, user=my_user, password=*****", 
    "dbtable" -> "schema.table_name", 
    "driver" -> "com.teradata.jdbc.TeraDriver")) 

Стек трассировки исключения:

warning: there were 1 deprecation warning(s); re-run with -deprecation for details 
java.lang.ClassNotFoundException: com.teradata.jdbc.TeraDriver 
     at scala.tools.nsc.interpreter.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:83) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at org.apache.spark.sql.jdbc.package$DriverRegistry$.register(jdbc.scala:227) 
     at org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:94) 
     at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:265) 
     at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:114) 
     at org.apache.spark.sql.SQLContext.load(SQLContext.scala:1242) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:19) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:27) 
     at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:29) 
     at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:31) 
     at $iwC$$iwC$$iwC$$iwC.<init>(<console>:33) 
     at $iwC$$iwC$$iwC.<init>(<console>:35) 
     at $iwC$$iwC.<init>(<console>:37) 
     at $iwC.<init>(<console>:39) 
     at <init>(<console>:41) 
     at .<init>(<console>:45) 
     at .<clinit>(<console>) 
     at .<init>(<console>:7) 
     at .<clinit>(<console>) 
     at $print(<console>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065) 
     at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338) 
     at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840) 
     at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871) 
     at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819) 
     at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:857) 
     at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902) 
     at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:875) 
     at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902) 
     at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:875) 
     at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902) 
     at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:875) 
     at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902) 
     at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:814) 
     at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:657) 
     at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:665) 
     at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:670) 
     at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:997) 
     at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945) 
     at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945) 
     at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135) 
     at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:945) 
     at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1059) 
     at org.apache.spark.repl.Main$.main(Main.scala:31) 
     at org.apache.spark.repl.Main.main(Main.scala) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:664) 
     at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:169) 
     at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:192) 
     at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:111) 
     at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 
+0

Поскольку класс не найден, флешка водителя не находится в пути к классам. Вы включили его? И правильно ли указано имя пакета и класса драйвера? 'com.teradata.jdbc.TeraDriver' –

+0

Да, я использую правильные банки при запуске искровой оболочки' '' ./bin/spark-shell -jars/home/path/*.jar -driver-class-path/главная/путь/*. jar'''. Также я использую то же имя класса, чтобы подключиться к JDBC Teradata от R. –

+0

Я не знаю Spark достаточно, но банку, конечно, нет в пути к классам. 'AbstractFileClassLoader' не смог найти его. Является ли сообщение об ошибке генерируемым оболочкой или серверным процессом в кластере, а затем отображается в оболочке? Затем банку также необходимо скопировать в путь к классам процесса сервера. Тот факт, что R имеет доступ к нему, может быть так, что он каким-то образом установлен с модулем R, но недоступен из scala/java. –

ответ

0

Эта ошибка происходит потому, что сосуд, содержащий драйвер не найден во время выполнения. Даже если у вас есть эта банка при запуске вашей программы, вам также необходимо распространить ее на все узлы кластера. Вы можете сделать это с помощью:

sc.addJar("yourDriver.jar") 

Если вы используете spark-submit, вы можете также добавить дополнительные банки с --jars:

./bin/spark-submit \ 
    --class <main-class> 
    --master <master-url> \ 
    --jars jar1.jar 
+1

Спасибо за ответ, я включил оба jdbc jar files '' './bin/spark-shell --jars /home/path/*.jar --driver-class-path/home/path/*. Jar' ''. Также пытался использовать '' 'sc.addJar (" jar ")' '', но все равно получал такое же исключение. –

+0

@DevPatel ... вы получили эту работу ... если так ... как? – user2061886

1

я, наконец, получил эту работу. Причина, по которой не работает с --jars объясняется на spark docs:

JDBC класса драйвер должен быть виден исконный загрузчик классов на клиентской сессии и на всех исполнителей. Это связано с тем, что класс драйвера DriverManager Java выполняет проверку безопасности, в результате чего он игнорирует все драйверы, не видимые первоклассному загрузчику классов, когда один отправляется , чтобы открыть соединение.

Решение:

  1. Скопируйте JDBC баночки для каждого из искровых узлов в кластере
  2. Измените spark-defaults.conf добавить опцию extraClassPath для водителя и исполнителя

Добавить их в spark-defaults.conf:

  • spark.driver.extraClassPath
    • /usr/lib/tdch/1.4/lib/terajdbc4.jar:/usr/lib/tdch/1.4/lib/tdgssconfig.jar
  • spark.executor.extraClassPath
    • /usr/lib/tdch/1.4/lib/terajdbc4.jar:/usr/lib/tdch/1.4/lib/tdgssconfig.баночка

Если вы используете Ambari, вы можете добавить эти два свойств под «Custom искрового дефолта», а затем перезапустить Спарк.

 Смежные вопросы

  • Нет связанных вопросов^_^