#python-3.x #amazon-web-services #cx-oracle #amazon-sagemaker
#python-3.x #amazon-веб-сервисы #cx-oracle #amazon-sagemaker
Вопрос:
Я следовал официальному руководству по установке, но пока мне не везло. Интересно, cx_Oracle
может ли это работать в виртуальной среде AWS SageMaker. Шаги, которые я использовал до сих пор, следующие:
- Создайте
/opt/oracle
каталог и распакуйте в нем базовый instantclient. sudo yum install libaio
sudo sh -c "echo /opt/oracle/instantclient_18_3 > /etc/ld.so.conf.d/oracle-instantclient.conf"
иsudo ldconfig
- И, наконец, экспортировал
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. Вот шаги, которые я предпринял:
- Я создал базу данных Oracle 12, используя Amazon RDS для целей тестирования. (Вы, конечно, можете пропустить этот шаг, если у вас уже есть база данных Oracle.)
- Я загрузил Oracle 12 Instant Client RPM, как описано здесь. Обратите внимание, что для загрузки этого файла вам понадобится учетная запись Oracle.
- Я загрузил RPM в свой экземпляр SageMaker Notebook из JupyterLab. Обратите внимание, что полная загрузка может занять 2-3 минуты, прежде чем переходить к следующему шагу. (Изначально у меня были проблемы с запуском установки, потому что загрузка все еще продолжалась.)
- Я выполнил все следующие команды из терминала 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
- Затем я установил библиотеку cx_Oracle:
source activate python3
pip install cx_Oracle --upgrade
- Затем, наконец, я создал новую записную книжку, используя ядро 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 /…