Упакованные пакеты - Airflow не может найти установленный модуль - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь использовать apache airlfow с упакованными пакетами (https://airflow.apache.org/docs/stable/concepts.html#packaged -dags ).

Я написал свой код как пакет python и, очевидно, мой код зависит от других популярных библиотек, таких как numpy, scipy et c.

РЕДАКТИРОВАТЬ: Это setup.py из моего пользовательского пакета python:

from setuptools import setup, find_packages
from pathlib import Path
from typing import List

import distutils.text_file

def parse_requirements(filename: str) -> List[str]:
    """Return requirements from requirements file."""
    # Ref: https://stackoverflow.com/a/42033122/
    return distutils.text_file.TextFile(filename=str(Path(__file__).with_name(filename))).readlines()


setup(name='classify_business',
      version='0.1',
      python_requires=">=3.6",
      description='desc',
      url='https://urlgitlab/datascience/classifybusiness',
      author='Marco fumagalli',
      author_email='marco.fumagalli@mycompany.com',
      packages = find_packages(),
      license='MIT',
      install_requires=
      parse_requirements('requirements.txt'),
      zip_safe=False,
      include_package_data=True)

требования. txt содержит пакеты (vertica_ python, pandas, numpy et c) вместе с их версией, необходимой для моего кода.

Я написал небольшой сценарий оболочки, основанный на предоставленном в do c:

set -eu -o pipefail

if [ $# == 0 ]; then
    echo "First param should be /srv/user_name/virtualenvs/name_virtual_env"
    echo "Second param should be name of temp_directory"
    echo "Third param directory should be git url"
    echo "Fourth param should be dag zip name, i.e dag_zip.zip to be copied into AIRFLOW__CORE__DAGS__FOLDER"
    echo "Fifth param should be package name, i.e classify_business"
fi


venv_path=${1}
dir_tmp=${2}
git_url=${3}
dag_zip=${4}
pkg_name=${5}



python3 -m venv $venv_path
source $venv_path/bin/activate
mkdir $dir_tmp
cd $dir_tmp

python3 -m pip install --prefix=$PWD git+$git_url

zip -r $dag_zip *
cp $dag_zip $AIRFLOW__CORE__DAGS_FOLDER

rm -r $dir_tmp

Оболочка установит мой пакет вместе с зависимостями напрямую из gitlab, zip и затем переместится в папку dags.

Это содержимое папки tmp_dir перед в архиве.

bin  
lib  
lib64  
predict_dag.py  
train_dag.py

Кажется, что Airflow не может импортировать пакет, установленный в lib или lib64. Я получаю эту ошибку

ModuleNotFoundError: Нет модуля с именем 'vertica_ python'

Я даже пытался переместить свой пользовательский пакет за пределы lib:

bin
my_custom_package
lib  
lib64  
predict_dag.py  
train_dag.py

Но все равно появляется та же ошибка.

PS: Я думаю, что одна из проблем заключается в том, как использовать pip для установки пакета в указанном c месте. В примере с потоком воздуха используется --install-option="--install-lib=/path/", но он не поддерживается:

Параметры изменения местоположения находятся в параметре --install-option: ['--install-lib'] из командной строки. Эта конфигурация может вызвать непредвиденное поведение и не поддерживается. Пип 20.2 уберет поддержку этой функциональности. Возможная замена - использование параметров уровня пипса, таких как --user, --prefix, - root и --target. Вы можете найти обсуждение относительно этого в https://github.com/pypa/pip/issues/7309.

Использование --prefix приводит к структуре, подобной выше, с ошибкой не найденного модуля.

Использование --target ведет к каждому пакету, установленному в указанном каталоге. В этом случае у меня возникает ошибка pandas

C extension: No module named 'pandas._libs.tslibs.conversion' not built

Я предполагаю, что это связано с динамическими c библиотеками, которые должны быть доступны на системном уровне?

Есть подсказка?

Спасибо

1 Ответ

0 голосов
/ 07 мая 2020

На странице документации Airflow, на которую вы ссылаетесь, говорится о упакованных группах обеспечения доступности баз данных:

Чтобы разрешить это, вы можете создать zip-файл, содержащий группы доступности базы данных в root ZIP-файл и распакуйте дополнительные модули в каталогах.

То, как я это понимаю, отличается от вашего. Я не думаю, что Airflow рассматривает эти упакованные группы доступности как настоящий пакет python. Это просто похоже на пользовательскую папку zip, которая будет добавлена ​​в вашу папку DAG. Таким образом, ваши папки lib или lib64, вероятно, не являются настоящими python модулями (у них нет файла __init__.py). Вот почему они говорят, что «дополнительные модули должны быть распакованы в каталогах».

Посмотрите на файл примера zip, который они дают:

my_dag1.py
my_dag2.py
package1/__init__.py
package1/functions.py

package1 имеет файл __init__.py. Так что в вашем случае ваша vertica_python библиотека должна быть импортирована напрямую следующим образом:

my_custom_package
vertica_python/
predict_dag.py  
train_dag.py

Однако я не думаю, что вы должны это делать. У меня сложилось впечатление, что модули, которые вы должны добавить сюда, являются вашими собственными разработанными модулями, а не сторонними библиотеками.

Поэтому я предлагаю вам установить библиотеки, необходимые для запуска упакованных групп доступности баз данных заранее.

...