Драйверы Netezza недоступны в Spark (Блокнот Python) в DataScienceExperience
У меня есть код проекта в Python Notebook, и он хорошо работал, когда Spark размещался в Bluemix.
Мы выполняем следующий код для подключения к Netezza (локально), который отлично работал в Bluemix.
VT = sqlContext.read.format('jdbc').options(url='jdbc:netezza://169.54.xxx.x:xxxx/BACC_PRD_ISCNZ_GAPNZ',user='XXXXXX', password='XXXXXXX', dbtable='GRACE.CDVT_LIVE_SPARK', driver='org.netezza.Driver').load()'
Однако после перехода на DatascienceExperience мы получаем следующую ошибку. Я установил безопасный шлюз и все работает нормально, но этот код не работает. Я думаю, что проблема с драйвером Netezza. Если это так, есть ли способ, которым мы можем явно импортировать класс / драйвер, чтобы можно было выполнить приведенный выше код. Пожалуйста, помогите, как мы можем решить эту проблему.
Error Message:
/usr/local/src/spark20master/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
61 def deco(*a, **kw):
62 try:
---> 63 return f(*a, **kw)
64 except py4j.protocol.Py4JJavaError as e:
65 s = e.java_exception.toString()
/usr/local/src/spark20master/spark/python/lib/py4j-0.10.3-src.zip /py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
317 raise Py4JJavaError(
318 "An error occurred while calling {0}{1} {2}.\n".
--> 319 format(target_id, ".", name), value)
320 else:
321 raise Py4JError(
Py4JJavaError: An error occurred while calling o212.load.
: java.lang.ClassNotFoundException: org.netezza.driver
at java.net.URLClassLoader.findClass(URLClassLoader.java:607)
at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:844)
at java.lang.ClassLoader.loadClass(ClassLoader.java:823)
at java.lang.ClassLoader.loadClass(ClassLoader.java:803)
at org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:38)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createC onnectionFactory$1.apply(JdbcUtils.scala:49)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createC onnectionFactory$1.apply(JdbcUtils.scala:49)
at scala.Option.foreach(Option.scala:257)
3 ответа
Вы можете установить файл jar, добавив ячейку с восклицательным знаком, которая запускает инструмент unix для загрузки файла, в этом примере wget:
!wget https://some.public.host/yourfile.jar -P ${HOME}/data/libs
После загрузки файла вам нужно будет перезапустить ядро.
Обратите внимание, что этот подход предполагает, что ваш файл JAR общедоступен в Интернете.
Записные книжки в Bluemix и записные книжки в DSX (Data Science Experience) в настоящее время используют один и тот же бэкэнд, поэтому они имеют доступ к одним и тем же предустановленным драйверам. Нетезза среди них нет. Как отметил Крис Сноу, пользователи могут устанавливать дополнительные JAR-файлы и пакеты Python в свои экземпляры сервисов.
Вероятно, вы создали новый экземпляр службы для DSX и еще не установили пользовательские JAR-файлы и пакеты, которые имел старый. Это однократная настройка, поэтому ее легко забыть, если вы некоторое время использовали один и тот же экземпляр. Выполните эти команды в записной книжке Python старого экземпляра в Bluemix для проверки установленных пользователем вещей:
!ls -lF ~/data/libs
!pip freeze
Затем установите недостающие вещи в свой новый экземпляр на DSX.
Существует еще один способ подключения к Netezza с использованием соединителя Inest, который по умолчанию включен в DSX.
http://datascience.ibm.com/docs/content/analyze-data/python_load.html
from ingest import Connectors
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
NetezzaloadOptions = {
Connectors.Netezza.HOST : 'hostorip',
Connectors.Netezza.PORT : 'port',
Connectors.Netezza.DATABASE : 'databasename',
Connectors.Netezza.USERNAME : 'xxxxx',
Connectors.Netezza.PASSWORD : 'xxxx',
Connectors.Netezza.SOURCE_TABLE_NAME : 'tablename'}
NetezzaDF = sqlContext.read.format("com.ibm.spark.discover").options(**NetezzaloadOptions).load()
NetezzaDF.printSchema()
NetezzaDF.show()
Спасибо,
Чарльз.