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

Python Etribied Etl: Acloudguru 2020 сентября

Я только что завершил вызов Acloudguru 2020 года, но на самом деле я чувствую, что я только добрался до … Помечено без сервера, AWS, Python.

Я только что закончил вызов Acloudguru 2020 года, но на самом деле я чувствую, что я достигли одного конца выбора-вашей собственной игры-приключений.

В основном, проблема состоит в том, чтобы создать автоматизированный процесс ETL (RAN один раз в день), который требует два источника данных COVID-19, слияния и очистки их, применяют некоторые преобразования и сохраняют результат к базе данных нашего выбора и отправки уведомлений о результатах процесс. Затем потребовалось приборная панель, которая использовала данные пост-этл в качестве источника. Вот официальный вызов Объявление Отказ

Хотя было много индивидуальных шагов, перечисленных в инструкциях, мой подход может быть разбит на следующие части, которые я буду расширяться в более поздних разделах:

  • Анализ: время, потраченное на изучение источников данных, учитывая разные маршруты решения

  • CI/CD.

  • ETL Construction: Разработка экстракта/преобразования/логики нагрузки

  • Выбор БД: выбирая правую БД и как я пошел с файлом CSV и S3 в качестве моей «базы данных»

  • Уведомления: Уведомление SNS-уведомления … а затем снимите … а затем повторно установить …

  • ETL/Устройство/Дымовое тестирование: процесс тестирования вручную, написание модульных тестов и пытаясь сделать правильный дымовой тест

  • Потребление/приборная панель данных

Анализ

Я провел довольно много времени, прежде чем делать какие-либо «работа», просто думая о том, как я хотел подойти к вызов. Я читаю инструкции несколько раз и посмотрел на данные. Я перечислю некоторые из моих первоначальных мыслей/наблюдений, а позже связывают их на будущий вариант,

  • Посмотрев на публичные сайты Quicksight и Tableau, я принял решение сделать саму поступления/приборной панели. Я не был уверен в то время, если бы я собирался использовать рамки или просто ванильные JS. Я склонялся к реакции, хотя.

  • Что касается CI/CD ресурсов, у меня много работают с действиями GitHub, поэтому я решил продолжить использование этого вместо кода * Линия продуктов, которые предлагает AWS.

  • После взгляда на исходные данные я знал, что хочу добавить поля, в частности, дополнительные данные. Существующие поля были совокупными случаями/смертью/восстановлениями. Я также заметил, что иногда более старые данные были обновлены свои записи (корректировки к случаям/смертям/извлечениям)

  • Мои первоначальные впечатления были то, что я хотел реляционную БД, хотя стоимость/сложность была большой проблемой. Это было одно из соображений, которые сделали шаг анализа дольше, чем ожидалось.

  • Forrest перечислил некоторые дополнительные сложные шаги, один из них является тестом дыма, который управлял процессом с фиктивными данными и проверил сообщение уведомления. Я знал, что хочу включить это в мое решение.

CI/CD.

После принятия решения о действиях GitHub для моего рабочего процесса, я разделил свой проект на два репозитория: Back-End/ETL/API данных и интернет-панель/панель инструментов.

ETL/API.

Я использовал Сэм, чтобы справиться с задней частью. Потому что я решил сделать интерфейс сам, у меня не было собственных интеграций в программное обеспечение/услугу Поэтому я знал, что мне нужен API для употребления данных. Я считал разделение API в отдельный проект SAM, но решил против него. Например, мое обоснование, которое для гипотетического изменения ETL, например, добавление источника данных, API, вероятно, также будет изменен, чтобы сделать новые данные доступными для пользователя.

Приборная доска

К этому времени я решил пойти с реагированием на приборную панель, поэтому я выбрал CDK для структурирования моего проекта/предоставления моих ресурсов. Это был выбор удобства, потому что я только что завершил шаблон для проекта React Project, который развернут с использованием CDK. Вы можете найти шаблон Reppo здесь Отказ

ETL Строительство

Это была довольно прямая часть проекта. Я разделяю экстракт/преобразование/нагрузовать шаги в отдельные .py Файлы и имели один осложник лямбда все. Я использовал одну лямбду для процесса CORE ETL, но я рассмотрел альтернативный подход с использованием нескольких деталей с десекуфатами для экстракта/преобразования/нагрузки. В конце концов, я застрял с одним подходом лямбда в основном из простоты, но я кратко опишу альтернативу.

Альтернативный подход

Я подумал, что наличие экстракта лямбда сохраняет загруженные данные в ведро «необработанные данные», которое вызвало преобразование/нагрузку на лямбда. Преобразование лямбда потребула бы логике, чтобы убедиться, что все источники данных были извлечены, прежде чем делать ее вещь. Я рассмотрел этот подход, когда я думал о масштабируемости одного etl лямбда. Я думал о том случае, когда наборы данных были более крупными или источниками данных более многочисленными. В этом случае этап экстракта может быть гораздо дольше, а штраф за неудачу в этапах преобразования/нагрузки гораздо более тяжелее (перезапущенные загрузки).

По этой же логике я считал отдельный преобразование лямбда/процесса. Это потому, что, поскольку данные становятся больше, процесс преобразования может быть за пределами возможностей Lambda (15-минутные временные ограничения и ограничения памяти) и, возможно, понадобится процесс Fargate/EC2 для завершения.

AWS CLEUE

У меня не было опыта с AWS Clee, но казалось, что это похоже на жизнеспособный вариант, особенно с моим выбором «базы данных», описанный позже. Часть меня хочет «выбрать другой путь» и повторно выполнить альтернативную версию этого проекта, используя вместо этого клея.

Выбор БД

Я провел много времени, идущих над этим выбором. Реакция моего колена, когда сначала смотрите на данные, была реляционной БД. Это чувство было укреплено моим желанием добавить поля, как указано в разделе «Анализ».

К сожалению, я посмотрел на RDS, и это было дорого, а также более сложным для интеграции с AWS Lambda. Главный блокировщик был затрат, хотя, чтобы повлечь за собой расходы, связанные с вставающим экземпляром RDS для 200-300 записей, казались неуместными. Я ненадолго смотрел в Aurora Serverless, но я не был уверен, насколько масштабируется/масштабируется от 0 ACU. Это была обеспокоенность, потому что мои данные должны были быть выставлены как шлюз API/Lambda для потребления Так что я не был уверен, как это повлияет на задержку.

Мой другой выбор был динамодб и альтернативой, которую я закончил выбрать, файл CSV, хранящийся в ведре S3. Я опишу, что пошло на мой выбор ниже,

Ежедневные данные

Я заметил во время моего первоначального анализа, когда данные были обновлены, иногда более старые записи были обновлены/скорректированы. Объект DataFrame имеет приятные методы, чтобы найти глобальные различия между двумя объектами. Пандас Позволяет преобразовать файл CSV в DataFrame в качестве одной операции. С Dynamodb, сравнения должны быть выполнены на уровне записи/элемента или я полагаю, результат сканирования может быть преобразован в DataFrame. В любом случае, казалось, что было бы необходимым больше операций.

Гибкость потребления данных

Мое начальное прислонение к реляционной БД было из-за возможностью гибко запросить данные. Что касается масштабируемости, я рассмотрел случай, когда этот проект был расширен, чтобы включить данные на уровне штата или округа, или многие другие поля были добавлены. В этом случае при потреблении данных я считаю, что он должен отфильтровать на стороне сервера (меньше). Также гибкие запросы в Dynamodb требуют настройки вторичных индексов, поэтому мне не понравилось как выбор.

Я чувствовал, что файл CSV, хранящийся в S3, в сочетании с лямбдой с использованием функций S3 Selection, дал мне лучшие варианты:

  • В случае новых полей есть четкий способ добавления новой гибкости запроса в терминах параметров строки запроса на конечной точке API.

  • Если сумма данных масштабировалась, что позволило различным сегментациям (странам, государству/провинции, округе) и новым потребителям этих данных, данные, потребляемые существующими пользователями, были бы относительно предсказуемыми, потому что с S3 выбирают, вы платите за данные после фильтрации место.

  • Если объем данных масштабируется достаточно, чтобы облегчить миграцию к экземпляру RDS, S3 Selection Logic должен быть в основном повторно использовать.

Уверенность

Выбор БД был самым сложным выбором, который я сделал в этом проекте, но выбор о том, как реализовать Уведомления ETL, безусловно, самый расстраивающий выбор.

Сначала он казался таким простым, имеет функцию пунктов назначения, которая позволяет автоматически интегрировать с несколькими различными услугами AWS, один из них, являющийся SNS, для асинхронных асинхронных заводов лямбда. Я думал, что это идеально, я просто зацепью это И я получаю автоматическое успех/неудачу публикации для моих подписчиков (мой адрес электронной почты). Тогда я видел уведомление …

Я посмотрел в документацию по назначениям, и вышесказанное было то, что я застрял (обратите внимание, некоторые контент были заблокированы с скриншота выше). Я понимаю, что направления, вероятно, предназначены для более того, чтобы машинные триггеры услуг, поэтому отправка над структурированным объектом JSON имеет больше смысла. Для читаемого человеком уведомление оно было … меньше идеала. На некоторое время я подумал, что хорошо технически, оно соответствует требованиям вызова, но выглядит ужасно, и это делает дым намного сложнее … Но казалось, что просто просто оставить эту конфигурацию адресатов в моем шаблоне Сэма, ну хорошо, время двигаться дальше.

Я распустил соединение etl лямбда-sns и вместо этого настроил место назначения моего процесса ETL, чтобы быть еще одной функцией Lambda, ответственную за публикацию SNS. Это достигло двух основных вещей,

Лучшие структурированные/отформатированные уведомления

Отфильтрованные уведомления

Я смог использовать атрибуты сообщения SNS для фильтрации сообщений для подписчиков. Я использовал это, чтобы создать подписчик, который только получил сообщения во время моего теста дыма, выполняющий использование параметра среды для обозначения прогонов по тестированию VS.

Я использовал очередь SQS в качестве цели моих уведомлений по тестированию, потому что это позволило программировать проверку полученных сообщений и был прямым источником сообщения. То, что я подразумеваю в том, что я считаю, что я считаю, что я рассматривал другую лямбду для тестовых сообщений и написание содержимого сообщения S3/Dynamodb для проверки функционирования уведомлений SNS. В этом смысле, хотя я также проверяю лямбда -> {s3, dynamodb} соединение, которое я чувствовал грязные воды теста, так сказать. Это одна область, где я хотел бы узнать, что такое стандартная практика, потому что мое решение чувствовало себя очень хакей.

ETL/Устройство/Дымовое тестирование

К этому времени у меня были три функции лямбда:

  • Функция Core ETL

  • SNS Publishing функция

  • Функция прокси Proxy Pateway API

Большинство моих модульных тестов были сосредоточены на функции ETL, я проверил модули экстракта/преобразования/нагрузки отдельно и пытались охватывать различные проблемы с данными, которые могут придумать.

Одним из несчастных последствий использования S3/S3 SELECT в качестве механизма базы данных/механизма потребления данных в том, что мото стандартная библиотека издевательства на услуги AWS, еще не имеет поддержки для него Таким образом, я не мог включать в себя правильный тест подразделения для моей Proxy Proxy Proxy Gateway.

Дымовой тест

На основании всех машин, которые я настроил вокруг дыма, например, Атрибуты сообщения SNS, QQS Queue, SNS Lambda Publisher. Фактический скрипт теста дыма был очень прямым. Это вызывает etl лямбда с Тестирование Значение окружающей среды. Затем он выбирает очередь SQS, чтобы определить, было ли правильное сообщение SNS было отправлено, то очищает любые тестовые файлы ETL, созданные в «базе данных». В этом случае я использовал префиксы S3 для разделения данных по производству VS-тестирования.

Потребление/приборная панель данных

Для этой части проекта я собрал быстрое приложение для реагирования и использовал Recharts Библиотека Чтобы создать график из данных, возвращаемых API, я устанавливаю выше.

Я включал несколько элементов управления, чтобы переключить, как данные агрегируются или пользователь просматривает случаи/смерть/восстановления. Хотя изначально я хотел добавить фильтры для некоторых полей, которые я добавил во время процесса преобразования, я оставил их в качестве возможных будущих улучшений, перевод, я немного устал и хотел завершить этот проект. Скриншот приборной панели предоставляется

Обновления приборной панели в реальном времени

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

Поскольку оба источника данных были в публичном реподе, я думаю, что я бы создал функцию, которая включает конечную точку API GitHub для обоих источников с некоторым уровнем частоты, и имеет значение сравнения этих конкретных файлов. Если есть изменения в этих файлах, вызвать событие ETL.

Это было бы технически технически быть в режиме реального времени, но с частым периодом конечной точки API GitHub, это может быть рядом с ним. Это также не загрузка файлов (ы), если не обязательно. Хотя я не уверен, есть ли ограничения квоты на API GitHub.

Вывод

Мне очень понравилось этот вызов. Я все еще чувствую, что есть куча разных способов достижения определенных шагов, и я очень соблазн делать несколько итераций всего.

Не стесняйтесь проверить мой Приборная панель или два репо, которые составляют проект: Фронт-конец и спина

Общая заглавная архитектура приведена ниже,

В целом, если это то, что мы можем ожидать от ежемесячных проблем Acloudguru, я очень с нетерпением жду их.

Слияние Я прошу прощения за длину этого поста, я просто сел, и все это вылилось.

Оригинал: “https://dev.to/jviloria96744/event-driven-python-etl-acloudguru-september-2020-challenge-ofn”