Большие надежды становятся нативными для Kubernetes
Недавно на работе мы обсуждали, как будет выглядеть конвейер машинного обучения нашей мечты. В качестве фонового исследования мы наткнулись на пакет Большие надежды, который выглядит очень многообещающе в качестве шага проверки данных в нашем пайплайне. В этой статье я собираюсь изучить использование Great Expectations как части рабочего процесса Argo для запуска проверки данных во время предварительной обработки данных.
Отказ от ответственности: я не эксперт! Для меня это процесс обучения, поэтому то, что я здесь реализую, скорее всего, не самое оптимальное решение. Great Expectations имеет прямую интеграцию с Prefect и Dagster, поэтому теоретически его будет проще использовать с этими инструментами. Мне просто нравится Арго.
1. Настройка нашей среды
Для этого проекта я запускаю все на кластере Minikube. Я не буду подробно останавливаться на каждом аспекте и предполагаю, что у вас установлены kubectl и helm 3.
Сначала запустите свой кластер minikube:
minikube start --cpus 4
Я запускаю свой с 4 процессорами для других проектов, но это не обязательно для нашего примера, поэтому аргумент «процессор» является необязательным.
Затем установите рабочие процессы Argo:
kubectl create ns argo kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-workflows/master/manifests/quick-start-postgres.yaml
Нам нужно немного подождать, пока все встанет и заработает. Если вы видите какие-либо статусы «Ошибка» и «CrashBackLoopOff» для ваших модулей, не беспокойтесь, обычно это проходит само по себе в течение ~ 5 минут.
Каждый раз, когда я устанавливаю рабочие процессы Argo, мне нравится запускать один из примеров рабочих процессов, просто чтобы заранее убедиться в отсутствии ошибок. Давайте получим доступ к нашему пользовательскому интерфейсу рабочих процессов через переадресацию портов.
kubectl port-forward svc/argo-server 2746:2746 -n argo
Теперь перейдите на https://localhost:2746. Вы получите предупреждение системы безопасности от Chrome (к счастью, это не производственная система). Вы должны увидеть стартовый экран Argo Workflows.
Нажмите «ОТПРАВИТЬ НОВЫЙ РАБОЧИЙ ПРОЦЕСС», а затем «Редактировать, используя полные параметры рабочего процесса». Это даст вам пример Hello World, который вы можете запустить, нажав «+ Создать». Если все пойдет хорошо, вы должны увидеть что-то вроде следующего:
Нам все еще нужно кое-что сделать, чтобы получить удаленный доступ к нашему серверу Argo. Как ни странно, если я буду следовать документации Argo, это не сработает, поэтому вот модифицированная версия, которая должна позволить вам отправлять рабочие процессы из Hera.
kubectl create role hera --verb=list,update,create --resource=workflows.argoproj.io -n argo kubectl create sa hera -n argo kubectl create rolebinding hera --role=hera --serviceaccount=argo:hera -n argo SECRET=$(kubectl -n argo get sa hera -o=jsonpath='{.secrets[0].name}') kubectl -n argo get secret $SECRET -o=jsonpath='{.data.token}' | base64 --decode
Теперь следите за этим токеном. Теперь у нас есть рабочая установка Argo Workflows! Следующим шагом будет запуск экземпляра Minio в minikube. Это может быть легко достигнуто с помощью карт руля.
helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update helm install ge-minio bitnami/minio --namespace argo
В данном случае я решил установить его в пространство имен argo, просто чтобы не загромождать себя. Последняя команда выдаст некоторый вывод о том, как получить ваши учетные данные Minio. Запустите эти команды и сохраните результат где-нибудь. Теперь мы готовы создать корзину проекта. Чтобы убедиться, что у вас есть правильные учетные данные, и получить представление о Minio, перенаправьте его службу и перейдите на localhost:9001.
kubectl port-forward svc/ge-minio 9001:9001 -n argo
Здесь я создал корзину под названием «большие ожидания».
Наконец, давайте установим пакет Hera для создания рабочих процессов Argo на python.
pip install hera-workflows
Теперь мы настроены!
2. Компоненты конвейера
После этого давайте поговорим о нашем примере конвейера проверки данных.
- Faker: пакет Python для быстрого создания поддельных наборов данных.
- Большие надежды: пакет Python для проверки данных.
- Minio: Объектное хранилище по аналогии с Amazon S3.
Каждый из этих компонентов имеет действительно отличную документацию, и существуют блоги, которые содержат гораздо больше подробностей, чем я могу рассказать о них, но я расскажу о важных для этого проекта моментах.
С помощью Faker мы хотим сгенерировать пример Pandas Dataframe того, что может быть входными данными для конвейера обработки данных. Мы можем сделать это просто с помощью faker:
Теперь у нас есть набор данных, включающий поддельных людей с кучей случайно сгенерированной информации, а также два столбца числовых характеристик, сгенерированных с помощью NumPy.
Теперь пришло время программно сгенерировать ожидания на основе этих данных. Я лично нашел это немного сложным, но я думаю, что мы доберемся до этого!
Теперь готовим на газу. У нас есть возможность генерировать поддельные данные, создавать из них набор проверки и запускать набор проверки. Чтобы добавить Minio, нужно просто заархивировать каталог /ge-store и поместить файл в нашу корзину с помощью python SDK. Хороший обзор представлен в Документации Minio.
3. Трубопроводы Арго
В последней части этого мы будем использовать Hera для создания и запуска наших тестовых пайплайнов. Чтобы правильно использовать Hera, нам нужен образ Docker, который покрывает все наши зависимости. Я сделал простой образ lambertsbennett/argo-ge:v1, чтобы запустить наш конвейер. Он основан на образе Python, поэтому он довольно большой.
Теперь давайте начнем с написания конвейера 1 для генерации и хранения наших ожиданий.
После множества мелких ошибок вот код, который сохраняет наш пакет Great Expectations в виде архива в корзине Minio.
Теперь давайте поработаем над вторым конвейером, чтобы сгенерировать некоторые поддельные данные, вытащим наш набор проверки из Minio, а затем запустим нашу проверку данных. Мы будем повторно использовать первый шаг конвейера для создания поддельных данных и многого из того, что мы сделали с файлом io.
Теперь, если мы перейдем к Minio и загрузим наш «ge-results.tar.gz» и заглянем внутрь, мы увидим подробные результаты наших усилий по проверке данных. Внутри архива в /uncommitted/data_docs/local_site мы видим index.html.
В этом наборе ожиданий есть несколько невероятно строгих правил, поэтому наша проверка не удалась.
Ну, я надеюсь, что это было интересно читать для кого-то. Код доступен на Github @ https://github.com/lambertsbennett/argo-great-expectations. Большие надежды кажутся очень мощными, но они очень сложные. К счастью, их документация довольно хороша. В будущем я буду работать над другими темами MLOP/Data Engineering/Data Science с использованием стеков на основе kubernetes и надеюсь написать об этом больше. Спасибо за чтение и, пожалуйста, оставьте комментарий, если у вас есть проблемы или идеи по улучшению!