Рубрики
Без рубрики

AWS Клей Первый Опыт – Часть 2 – Зависимости и кишки

Задача № 2: Зависимости В предыдущем эпизоде мы узнали, что это скорее … Помечено с AWS, Datascity, Python, Serverless.

Мое путешествие клея 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-файлы Аргумент и устанавливает его отдельно с пипс .

Это говорит мне пару вещей:

  1. Зависимости упомянуты в setup.py автоматически загружаются из pypi, так как Пандас зависит от воплощение Это скачат его, а вторым установкой.

  2. Использование хранилища частного пакета, где находится зависимости, а также не будет работать безупречно.

  3. Порядок поставленных зависимостей

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”