Драйверы 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()

Спасибо,

Чарльз.

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