Мое путешествие клея AWS (5 части серии)
Задача № 2: Зависимости
В предыдущем эпизоде мы узнали, что довольно просто поставить код в один файл Python и запустить его. Однако это часто не лучшее решение, и это имеет больше смысла разделять код в отдельные модули или использовать код из существующих библиотек. Я собирался назвать эту часть внешних зависимостей, но вы скоро узнаете, почему я покинул внешний
из.
Есть несколько страниц документации, упомянув, как работать с зависимостями и различиями между Pyspark
и Python Shell
рабочие места. Это может быть не совсем очевидно, когда вы впервые просматриваете документы.
Для рабочих мест Pyspark есть эта страница: https://docs.aws.azomazon.com/glue/latest/dg/aws-glue-programming-python-libramer.html Для рабочих мест Python Shell есть еще одна страница: https://docs.aws.amazon.com/glue/latest/dg/add-job-python.html#python-shell-supported-library
Несоответствия : Каждая из страниц можно найти в совершенно разных разделах и, следовательно, легко пропустить.
Обеспечение зависимостей для рабочих мест Pyspark
Английский не мой родной язык и документация смущает меня здесь с объяснением, а не дарить простой пример.
На данный момент клей поддерживает только чистые библиотеки Python, что означает, что мы не можем использовать библиотеки на основе C ( Pandas
, numpy
) или расширения с других языков.
Зависимости могут поставляться в двух формах.
. Одинокий файл б.
оздоровительный
Архив, содержащий пакеты Python.
Пакеты внутри оздоровительный
Архив должен быть в корне архива.
$ zipinfo -1 dependencies.zip pkg2/ pkg2/__init__.py pkg1/ pkg1/__init__.py
Каждая зависимость должна быть загружена в ведро S3, а затем поставляется в виде « Special Parameter
_» --extra-py-файлы
к конкретной работе в формате URL-отделенных запятыми URL.
Вы должны указать каждый файл отдельно S3://bucket/prefix/lib_a.zip3s3://bucket_b/prefix/lib_x.zip
который становится раздражающе неуклюже, если ваша работа имеет более одной зависимости.
За кулисами
Ваш или
оздоровительный
Файл скопирован в /TMP
каталог, доступный во время выполнения задания. Вводится в Pythonpath
А также добавлен как аргумент -py-файлы
к Spark-Отправить
Отказ
Примечание:
Нам дали доступ к предварительному просмотру клея 2.0, который сломал Spark-Отправить
Аргумент и искра не могли видеть код, указанный внутри ZIP-файла. К счастью, можно поставить PY-файлы
во время выполнения работы в Спардинация
Отказ Это было позже установлено командой AWS, и нам было уведомлено о фиксуальном случае, когда наша работа начала провалиться из-за применяемого обходного пути выше. Стоит отметить, что клей 2.0 работает Python 3.7.
Обеспечение зависимостей для рабочих мест Python Shell
Остерегаться:
Документация рабочих мест Python Shell действительно сложно, а иногда и сбивает с толку, в основном, поскольку примеры предоставляются без достаточного количества контекста, а некоторые примеры кода написаны на устаревших питонах, в то время как другие в Python 3.
Для предоставления документации внешних зависимостей консультируют использование .яйцо
или .WHL
файлы. Загрузите их в S3 и список как -Экстра-PY-файлы
аргумент
Среда выполнения включает в себя несколько предустановленных пакетов.
Boto3 collections CSV gzip multiprocessing NumPy pandas (required to be installed via the python setuptools configuration, setup.py) pickle PyGreSQL re SciPy sklearn sklearn.feature_extraction sklearn.preprocessing xml.etree.ElementTree zipfile
Из-за моего прошлого опыта с AWS Lambda я подозревал, что версии предустановленных пакетов могут быть устаревшими.
Поэтому я решил создать простую работу My-Pyshell-Job
и отредактируйте код, используя онлайн-редактор, просто чтобы получить версии конкретных библиотек. Код очень прост:
Результат кода выше
boto3 1.9.203 numpy 1.16.2 pandas 0.24.2
Подтвердил, что мое предположение было правильным, и версии немного датируются, поэтому вы не получите последние стабильные версии.
Который оставил меня никакого другого выбора, чем устанавливать его.
Это точка, в которой документация не хватает объяснения, и я остался с пробным и ошибкой.
Установка
Зная, что мне нужно предоставить .WHL
Я провел команду Пип колесные Pandas
на моем маке. И начал эксперименты.
Это загрузило несколько файлов колеса:
numpy-1.19.0-cp36-cp36m-macosx_10_9_x86_64.whl python_dateutil-2.8.1-py2.py3-none-any.whl six-1.15.0-py2.py3-none-any.whl pandas-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl pytz-2020.1-py2.py3-none-any.whl
Я взял мой образец из указанного выше и назвал его my_pyshell_job.py
и вместе с .WHL
Файлы выше загружены на ведро S3.
Обновлена работа с командой AWS CLI.
aws glue update-job --job-name my-pyshell-job --job-update '{ "Role": "MyGlueRole", "Command": {"Name": "my-pyshell-job", "ScriptLocation": "s3://bucket/my_pyshell_job.py"}, "DefaultArguments": { "--extra-py-files": "s3://bucket/dependencies/library/numpy-1.19.0-cp36-cp36m-macosx_10_9_x86_64.whl,s3://bucket/dependencies/library/python_dateutil-2.8.1-py2.py3-none-any.whl,s3://bucket/dependencies/library/six-1.15.0-py2.py3-none-any.whl,s3://bucket/dependencies/library/pandas-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl,s3://bucket/dependencies/library/pytz-2020.1-py2.py3-none-any.whl" } }'
И начал работу через консоль.
Работа закончена с ошибкой ImportError:
Отказ
AWS CLEUE использует журналы AWS CloudWatch, есть две группы журналов для каждой работы. /AWS-CLEUE/Python-Jobs/Выход
который содержит stdout
и /AWS-CLEUE/Python-Jobs/Ошибка
для север
. Внутри групп журналов Вы можете найти поток журнала вашего задания с именем Job_run_id
например. /AWS-клей/Python-Jobs/вывод/jr_3c9c24f19d1d2d5f9114061b13d4e5c97881577c26bfc45b99089f2e1abe13cc
. Я также узнал, что Ошибка
Журнал создан только в том случае, если задание завершится ошибкой, поэтому, если вы планируете воспользоваться ошибками, которые не проваливаются в системе работы stdout.
.
Содержание вывод
журнал содержит Пип
журналы. И сообщил, что все библиотеки были успешно установлены. Тем не менее, Ошибка
Журнал содержит весь след стека этой ошибки.
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'`. ImportError: IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE! Importing the numpy C-extensions failed. This error can happen for many reasons, often due to issues with your setup or how NumPy was installed.
Сообщение об ошибке сообщает нам, что это, скорее всего, вызвано несоответствием ОС.
Поэтому я бежал еще одну простую работу, чтобы дать мне более подробную информацию о платформе.
Я попробовал это с помощью рабочих мест Pyspark, так и Python Shell, и результаты были немного удивительными.
Python Shell Jobs работают на дебиал
: Linux-4.14.123-86.109.amzn1.x86_64-X86_64-с-Debian-10.2
В то время как Pyspark Jobs работают на Amazon Linux Linux-4.14.133-88.112.amzn1.x86_64-x86_64-с-glibc2.3.4
скорее всего, будет Amazoncorretto
.
Следующий шаг был понятен, мне нужен колесо
с numpy
построен на Debian
Linux. Поскольку план должен был развернуть использование CI/CD, я решил использовать Официальный Python Docker Image Python: 3.6-Slim-Buster
Отказ
Беги Пип колесные Pandas
Опять же, чтобы получить правильные пакеты и удалить уже установленные.
numpy-1.19.0-cp36-cp36m-manylinux2010_x86_64.whl pandas-1.0.5-cp36-cp36m-manylinux1_x86_64.whl
Загрузить Колеса
к S3. Обновите и запустите работу.
Работа прошла! И вот как выглядит результат:
boto3 1.9.203 numpy 1.19.0 pandas 1.0.5
Но подожди, в журнале больше.
Processing ./glue-python-libs-psoetpzo/numpy-1.19.0-cp36-cp36m-manylinux2010_x86_64.whl Installing collected packages: numpy Successfully installed numpy-1.19.0 Processing ./glue-python-libs-psoetpzo/pandas-1.0.5-cp36-cp36m-manylinux1_x86_64.whl Collecting pytz>=2017.2 Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB) Collecting numpy>=1.13.3 Downloading numpy-1.19.0-cp36-cp36m-manylinux2010_x86_64.whl (14.6 MB) Collecting python-dateutil>=2.6.1 Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB) Collecting six>=1.5 Downloading six-1.15.0-py2.py3-none-any.whl (10 kB) Installing collected packages: pytz, numpy, six, python-dateutil, pandas Successfully installed numpy-1.19.0 pandas-1.0.5 python-dateutil-2.8.1 pytz-2020.1 six-1.15.0
Если вы посмотрите внимательно, вы можете заметить, что numpy
Был установлен дважды, вопрос в том, почему?
Ответ лежит внутри другого файла под названием /tmp/runscript.py
Отказ Этот файл отвечает за Orchestration установку и выполнение вашего кода, а также предоставляя след стека в случае исключения.
/tmp/runscript.py.
Из чистого любопытства я решил распечатать содержание этого файла, чтобы узнать, почему numpy
был установлен дважды.
Содержание этого файла было просвещено, но и шокирующее.
После первых 12 линий импорта был комментарий к линии 14
## TODO: добавить базовый Unittest
Хорошо, это немного страшно, потому что комментарий, как таковой комментарии, либо предполагает, что разработчик не хватило времени, чтобы написать тесты при спешках в производство, и рецензент оставил это, чтобы проскользнуть.
Если ваш код не содержит достаточно тестов, вы должны держать его внутри или громко предупредить своих клиентов о потенциальных последствиях.
По дальнейшей экспертизе я заметил, что этот сценарий также используется для рабочих мест Pyspark.
Немного дальше в файл, есть функция Download_and_install
Отказ Комментарий выше функции описывает ее цель # Скачать дополнительные файлы PY и добавьте их в путь Python
(Могут также использовать DOCSTRING правильно?).
Функция принимает каждый файл, поставляемый в --extra-py-файлы
Аргумент и устанавливает его отдельно с пипс
.
Это говорит мне пару вещей:
Зависимости упомянуты в
setup.py
автоматически загружаются из pypi, так какПандас
зависит отвоплощение
Это скачат его, а вторым установкой.Использование хранилища частного пакета, где находится зависимости, а также не будет работать безупречно.
Порядок поставленных зависимостей
AWS Клей примеры и Libs
Говоря о зависимостях AWS CLEUE обеспечивает свою основную функциональность через библиотеку под названием awsglue Отказ Код расположен на github. Несмотря на то, что код является общественным, сопровождающие хранилища, похоже, не заинтересованы в идеях сообщества и запросы на потяну, потому что есть много запросов на тягу без какого-либо ответа от команды AWS Clue. Судя по реакциям на Неотдаченный вопрос Я не единственный, кто чувствует себя таким образом.
Дружественное предупреждение , если вы собираетесь попытаться что-либо, используя этот репозиторий на вашей местной машине, я настоятельно рекомендую сделать это в изолированной среде, либо использую Докер
Контейнер или виртуальная машина. Код изменяет некоторые местные каталоги и Pythonpath
Отказ
Во время моей работы над этим проектом репозиторий содержит 2 версиях один в каждой ветке Клей-0,9
и Клей-1.0
+ файл Readme, который был немного запутанным, потому что он описал процесс для обеих версий.
Процесс «Установка» также является несколько болезненным, если единственное, что вы хотите, – это завершение кода в вашей IDE, потому что библиотека не обеспечивает никакого механизма для простой установки. И единственный способ запустить этот код – ZIP awsglue
каталог zip -r pyglue.zip awsglue
Отказ И добавьте его к вашему Pythonpath
(см. Bin/setup.sh
Например). Как вы, возможно, заметили, что репозиторий содержит Bash
Команды и Windows в настоящее время не поддерживаются (есть открытый запрос на тяга ).
Если вы посещаете репозиторий, чтобы найти примеры тестов, которые вы будете очень разочарованы, потому что нет никаких тестов вообще!
Практика кодирования
Поскольку репозиторий не содержит каких-либо автоматики для льмина и тестирования, существует много ошибок с линтами и потенциально опасными линиями.
Один пример использует неизменно в качестве аргумента по умолчанию:
Это оценка конфигурации пилинта по умолчанию Ваш код был оценен в 2.94/10
Использование простого текста и пилинта не всегда идеальна при представлении ошибок к более широкой аудитории. С Codeacio Мы можем увидеть отчет в цифрах, но и отслеживание выпуска со временем.
Я развел репозиторий и запустил отчет для вас. Пожалуйста, имейте в виду, что я оставил всю конфигурацию по умолчанию, и поэтому результаты могут быть не точны на 100%, но должны дать идею о текущем состоянии.
Результаты codeac.io для AWS-CLEUE-LIBS
Помимо опасных ценностей по умолчанию, вы можете найти недостающие Docstrings, #Todo
Комментарии, слишком длинные линии, неиспользованные импорт и многие другие.
Перед последним обновлением 5 мая 2020 года было несколько ошибок импорта, предотвращающие даже кода даже запущены или тестировать его. Это обновление исправило несколько отверстий, однако все еще есть сочетание импорта, ожидающих, чтобы вызвать больше проблем. Если вам интересно, как работает Python Imports Я предлагаю читать Эта статья из Realpython
AWS поддерживает еще один репозиторий, называемый AWS-CLEUE-образцы Отказ История этого хранилища немного лучше, похоже, активно поддерживается Я сообщил и выпустил о плохой практике кодирования использования Импорт *
И получил ответ на 2 дня спустя то, что я считаю довольно быстрого действия в мире открытого исходного кода.
Хотя я не нашел примеров, особенно полезных для себя, и качество кода немного лучше, чем упомянутое AWS-CLEUE-LIBS
Отказ Примеры обычно содержат много комментариев, которые могут быть действительно полезны, если вы Новый для AWS клей и науки о данных в частности.
Как вы можете видеть, тривиальный пример выполнения одного файла сценария без зависимостей может быстро обостриться и уловить вас от гвардии. В следующем эпизоде мы собираемся исследовать, как параметризировать и настроить приложение клей.
Код для примеров в этой статье можно найти в моем репозитории GitHub AWS-CLEUE-MONOREPO-STYLE
Мое путешествие клея AWS (5 части серии)
Оригинал: “https://dev.to/1oglop1/aws-glue-first-experience-part-2-dependencies-and-guts-29l”