Как использовать cx_Oracle в AWS SageMaker (записная книжка Jupyter)

#python-3.x #amazon-web-services #cx-oracle #amazon-sagemaker

#python-3.x #amazon-веб-сервисы #cx-oracle #amazon-sagemaker

Вопрос:

Я следовал официальному руководству по установке, но пока мне не везло. Интересно, cx_Oracle может ли это работать в виртуальной среде AWS SageMaker. Шаги, которые я использовал до сих пор, следующие:

  1. Создайте /opt/oracle каталог и распакуйте в нем базовый instantclient.
  2. sudo yum install libaio
  3. sudo sh -c "echo /opt/oracle/instantclient_18_3 > /etc/ld.so.conf.d/oracle-instantclient.conf" и sudo ldconfig
  4. И, наконец, экспортировал LD_LIBRARY_PATH с: export LD_LIBRARY_PATH=/opt/oracle/instantclient_18_3:$LD_LIBRARY_PATH

При попытке запустить соединение внутри записной книжки с помощью connection = cx_Oracle.connect(usr '/' pwd '@' url) я получаю DPI-1047 код ошибки, в котором говорится, что libclntsh.so не удается открыть, однако эта библиотека находится в /opt/oracle папке. В качестве другого варианта, при запуске того же соединения через консоль Python терминала я получаю ORA-01804 код ошибки, в котором говорится, что файлы часовых поясов не были прочитаны должным образом, что я также пытаюсь исправить, но подозреваю, что это связано с тем, что cx_Oracle не удается найти папку библиотеки. (Теперь объясните мне: почему для компании-миллиардера должно быть так сложно создать достойную библиотеку для импорта и установки?)

Есть ли какой-то шаг, который я пропускаю? Есть ли какие-либо подробности об AWS SageMaker, которые я должен учитывать? Кроме того, существует ли другой вариант извлечения данных с сервера Oracle с помощью Python и AWS?

Комментарии:

1. Если кто-нибудь знает кого-то, кто мог бы решить эту проблему, я даже готов заплатить приличную сумму, чтобы узнать решение этой проблемы.

2. Я тоже озадачен, почему Amazon так усложнил для вас задачу. У меня нет никакого опыта работы с AWS, поэтому у меня нет прямого ответа. Три комментария: (i) инструкции по установке cx_Oracle на самом деле находятся по адресу cx-oracle.readthedocs.io/en/latest/installation.html (ii) вы не указали точное сообщение об ошибке DPI, которое могло бы быть полезным. (iii) вам не нужно (не должно) указывать LD_LIBRARY_PATH после настройки ldconfig.

3. На самом деле мой комментарий был нацелен на Oracle за то, что она сделала библиотеку настолько подверженной ошибкам конфигурации (как и многие другие программы, которые они продают), но я предполагаю, что это также применимо к Amazon. (i) размещенная вами ссылка содержит те же инструкции, что и в руководстве, которому я следовал, на которое они указывают при загрузке пакетов; (iii) вы правы, и я забыл об этом, просто я сделал оба, потому что ни один из них не будет работать.

4. (ii) полная ошибка такова: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help .

5. Возможно, это предположение в темноте, но не могли бы вы уточнить, куда вы экспортировали LD_LIBRARY_PATH ? Возможно, сеанс ядра Jupyter не использует переменные среды совместно с вашим сеансом терминала. (Альтернативой является перенос ваших шагов в конфигурацию жизненного цикла ноутбука или использование %env директив)

Ответ №1:

Привет и спасибо за использование SageMaker!

После некоторых усилий я наконец смог определить последовательность шагов, которая позволила мне запросить базу данных Oracle 12 из экземпляра SageMaker notebook. Вот шаги, которые я предпринял:

  1. Я создал базу данных Oracle 12, используя Amazon RDS для целей тестирования. (Вы, конечно, можете пропустить этот шаг, если у вас уже есть база данных Oracle.)
  2. Я загрузил Oracle 12 Instant Client RPM, как описано здесь. Обратите внимание, что для загрузки этого файла вам понадобится учетная запись Oracle.
  3. Я загрузил RPM в свой экземпляр SageMaker Notebook из JupyterLab. Обратите внимание, что полная загрузка может занять 2-3 минуты, прежде чем переходить к следующему шагу. (Изначально у меня были проблемы с запуском установки, потому что загрузка все еще продолжалась.)
  4. Я выполнил все следующие команды из терминала Jupyter, как предписано в инструкциях Oracle:
 cd SageMaker

sudo yum install oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
sudo sh -c "echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig
sudo mkdir -p /usr/lib/oracle/12.2/client64/lib/network/admin

# Restart Jupyter...
sudo restart jupyter-server
  
  1. Затем я установил библиотеку cx_Oracle:
 source activate python3
pip install cx_Oracle --upgrade
  
  1. Затем, наконец, я создал новую записную книжку, используя ядро conda_python3:
 import cx_Oracle
db = cx_Oracle.connect("my_username/my_password@my-rds-instance.ccccccccccc.us-east-1.rds.amazonaws.com/ORCL")

# Example query
cursor = db.cursor()
for row in cursor.execute('select * from DBA_TABLES'):
  print(row)
  

… и тогда это сработало!

Обратите внимание, что мне потребовалось несколько попыток, чтобы определить точную строку подключения, которая может отличаться в зависимости от того, как настроена ваша база данных. К сожалению, сообщения об ошибках было трудно понять — в моем случае у меня была ошибка ORA-12504: TNS: слушателю не было присвоено имя SERVICE_NAME в CONNECT_DATA, пока я не указал /ORCL в конце строки подключения.

Если вам нужно часто выполнять эти шаги, вы можете добавить установку и настройку клиента Oracle в скрипт SageMaker для настройки жизненного цикла. Я не тестировал этот сценарий, но, возможно, стоит попробовать!

И последнее, я заметил в вашем вопросе, что вы используете клиент Oracle 18. Я не тестировал именно этот сценарий, поскольку у меня есть доступ только к базе данных Oracle 12. Однако клиент Oracle 12 также должен иметь возможность подключаться к базе данных Oracle 18.

Лучший, Кевин

Комментарии:

1. Большое вам спасибо за ваши усилия. Я попробую, как только у меня появится немного свободного времени.

2. Вы можете загрузить RPM Oracle Instant Client с сервера yum от Oracle, не требуя учетной записи или пошагового руководства: yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64 /…