Установка JupyterHub Oracle InstantClient и cx_Oracle

Я установил JupyterHub, используя контейнер Docker.

  1. Я создал новую среду Anaconda Environment cx_oracle_env и установил пакет cx_Oracle в Терминале:

    # Creates a new Anaconda Environment called "cx_oracle_env" using Python 3.7 in silent mode
    conda create -n cx_oracle_env python=3.7 -y
    # >>>> Returns no warnings / errors
    
    # Activates the Anaconda Environment "cx_oracle_env"
    conda activate cx_oracle_env
    # >>>> Returns no warnings / errors
    
    # Mamba is a reimplementation of the conda package manager in C++.
    # - parallel downloading of repository data and package files using multi-threading
    # - libsolv for much faster dependency solving, a state of the art library used in the 
    #   RPM package     manager of Red Hat, Fedora and OpenSUSE
    # - core parts of mamba are implemented in C++ for maximum efficiency
    # At the same time, mamba utilize the same command line parser, package installation and 
    # deinstallation code and transaction verification routines as conda to stay as compatible as 
    # possible.
    #
    conda install mamba -n base -c conda-forge -y
    # >>>> Returns no warnings / errors
    
    # Installs ipykernel in currently active Anaconda Environment
    mamba install ipykernel -y
    # >>>> Returns no warnings / errors
    
    # Installs cx_Oracle
    python -m pip install cx_Oracle --upgrade
    # >>>> Returns no warnings / errors
    
    # Binds ipykernel "cx_oracle_env" to Anaconda Environment "cx_oracle_env"
    python -m ipykernel install --user --name cx_oracle_env --display-name="cx_oracle_env"
    # >>>> Returns no warnings / errors
    
  2. Я загрузил ORACLE InstantClient Instantclient-basic-linux.x64-21.1.0.0.0.zip из https://www.oracle.com/uk/database/technologies/instant-client/linux-x86-64-downloads.html на мой локальный компьютер и загрузил zip-файл в рабочий каталог JupyterHub.

  3. Я открыл новый блокнот Jupyter, выбрав cx_oracle_env в разделе Блокнот панели запуска.

  4. В Jupyter Notebook я распаковал файл Instantclient-basic-linux.x64-21.1.0.0.0.zip, используя следующую команду:

    from shutil import unpack_archive
    # Decompress ZIP-file to working directory (/home/jovyan/instantclient_21_1/)
    unpack_archive('instantclient-basic-linux.x64-21.1.0.0.0.zip', '')
    >>>> Returns no warnings / errors
    
  5. Проверьте, существует ли путь:

    import os.path
    from os import path
    path.exists("/home/jovyan/instantclient_21_1")
    # >>>> Returns True
    
  6. Установите LD_LIBRARY_PATH:

    import os
    os.environ["LD_LIBRARY_PATH"] = "/home/jovyan/instantclient_21_1"
    !echo $LD_LIBRARY_PATH
    # >>>> Returns /home/jovyan/instantclient_21_1
    
  7. Установите ORACLE_HOME:

    os.environ["ORACLE_HOME"] = "/home/jovyan/instantclient_21_1"
    !echo $ORACLE_HOME
    # >>>> Returns /home/jovyan/instantclient_21_1
    
  8. Установите libaio:

    !mamba install libaio -y
    # >>>> Returns no warnings / errors
    
  9. Импортируйте cx_Oracle:

    import cx_Oracle
    # >>>> Returns no warnings / errors
    
  10. После вызова init_oracle_client я получаю следующую ошибку:

    cx_Oracle.init_oracle_client(lib_dir=r"/home/jovyan/instantclient_21_1")
    

введите описание изображения здесь

Что мне не хватает?

PS: К сожалению, у меня нет разрешений sudo в терминале JupyterHub ...  введите описание изображения здесь


person Peter    schedule 11.03.2021    source источник


Ответы (2)


К сожалению, переменная среды LD_LIBRARY_PATH должна быть установлена ​​до запуска процесса, поэтому ее изменение в вашем скрипте Python не сработает.

Кроме того, из-за ограничений в том, как в настоящее время создается мгновенный клиент, cx_Oracle.init_oracle_client() нельзя использовать в Linux без предварительной настройки LD_LIBRARY_PATH вне процесса. Надеюсь, это ограничение скоро будет снято, но пока это то, что вам нужно сделать. Вы также можете использовать ld.so.conf конфигурацию, чтобы установка работала для всей вашей машины, и в этом случае настройка LD_LIBRARY_PATH больше не нужна.

person Anthony Tuininga    schedule 11.03.2021
comment
Также не устанавливайте ORACLE_HOME при использовании Instant Client. Для получения дополнительной информации см. Instant Инструкции по установке клиента, которые находятся внизу страницы загрузки. Для получения информации об инициализации cx_Oracle см. cx-oracle.readthedocs.io/en/ latest / user_guide / - person Christopher Jones; 12.03.2021

Наконец, я решил проблему, создав новую среду JupyterHub, настроив Dockerfile из https://github.com/jupyter/docker-stacks/blob/master/minimal-notebook/Dockerfile и встроил его как новую среду Minimal Oracle в JupyterHub.

Пользовательский файл Dockerfile имеет следующее содержимое (я добавил только начальную / конечную часть установки cx_Oracle):

# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
ARG BASE_CONTAINER=jupyter/base-notebook
FROM $BASE_CONTAINER

LABEL maintainer="Jupyter Project <[email protected]>"

USER root

# Install all OS dependencies for fully functional notebook server
RUN apt-get update && apt-get install -yq --no-install-recommends \
    build-essential \
    vim-tiny \
    git \
    inkscape \
    libsm6 \
    libxext-dev \
    libxrender1 \
    lmodern \
    netcat \
    # ---- nbconvert dependencies ----
    texlive-xetex \
    texlive-fonts-recommended \
    texlive-plain-generic \
    # ----
    tzdata \
    unzip \
    nano-tiny \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# cx_Oracle installation begin
WORKDIR /opt/oracle
RUN apt-get update && apt-get install -y libaio1 wget
RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && \
    unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \
    cd /opt/oracle/instantclient* && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci && \
    echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf && ldconfig
RUN python -m pip install cx_Oracle
WORKDIR $HOME
# cx_Oracle installation end

# Create alternative for nano -> nano-tiny
RUN update-alternatives --install /usr/bin/nano nano /bin/nano-tiny 10

# Switch back to jovyan to avoid accidental container runs as root
USER $NB_UID

После создания настраиваемого файла Dockerfile локально и встраивания его в кластер Kubernetes в качестве минимальной среды Oracle я запустил новый блокнот Jupyter во вновь созданной среде JupyterHub и протестировал соединение ORACLE следующим образом:

введите описание изображения здесь

person Peter    schedule 25.03.2021