Блог Amazon Web Services
Анализ данных в реальном времени с бессерверной (serverless) потоковой обработкой
Оригинал статьи: ссылка (Justin Pirtle, Specialist Solutions Architect)
Продолжая тему, начатую в предыдущих постах этой серии о паттернах обмена сообщениями и интеграции приложений с помощью очередей, сегодня мы рассмотрим потоковую обработку, и как она помогает осуществлять анализ данных с низкой задержкой, практически в режиме реального времени. В AWS есть два сервиса для работы с потоками: Amazon Kinesis и Amazon Managed Streaming for Apache Kafka (Amazon MSK).
Что такое потоковые данные?
В AWS потоковыми данными мы называем такие данные, которые непрерывно производятся в большом объёме с целью их обработки с минимальной задержкой. В то время как традиционные методы бизнес-аналитики используют пакетную обработку и предоставляют информацию в ретроспективе прошедших месяцев, дней или часов, потоковая обработка может предложить аналитику для принятия практических решений в реальном времени. Потоковая обработка обычно используется для анализа данных о посещении сайта (clickstream events), быстрой обработки различных типов логов, а также извлечения, преобразования и загрузки (Extract, Transform, Load; ETL) данных, поступающих в режиме реального времени, в озеро данных (data lake) или хранилище данных (data warehouse).
Amazon Kinesis – это группа сервисов AWS, которые облегчают сбор, обработку и анализ таких потоковых данных в реальном времени. В нее входят следующие четыре сервиса:
- Kinesis Data Streams: позволяет принимать, буферизировать (накапливать) и осуществлять настраиваемую обработку ваших потоковых данных;
- Kinesis Data Firehose: позволяет принимать, преобразовывать и загружать данные в Amazon S3, Amazon Redshift, Amazon Elasticsearch Service или Splunk;
- Kinesis Data Analytics: позволяет в режиме реального времени агрегировать и фильтровать потоковые данные;
- Kinesis Video Streams: обеспечивает передачу видео в облако AWS для аналитики, машинного обучения (Machine Learning; ML), повторного воспроизведения и других видов обработки.
В этом посте мы сосредоточимся на Kinesis Data Streams и Kinesis Data Firehose, так как оба эти сервиса являются основополагающими для передачи, приёма, буферизации и обработки ваших потоковых данных.
Kinesis Data Streams
Amazon Kinesis Data Streams – это сервис с широкими возможностями масштабирования, который может непрерывно осуществлять сбор данных со скоростью несколько гигабайт в секунду из сотен тысяч источников. Как и многие распределённые системы, Kinesis Data Streams достигает такого уровня масштабируемости с помощью разделения ваших данных на сегменты (шарды; shards), при котором данные записываются и читаются из разных сегментов параллельно. Каждый поток в Kinesis Data Streams требует выделения как минимум одного сегмента, при этом вы сами можете выбрать, сколько сегментов будет в потоке.
Каждый сегмент в Kinesis Data Streams поддерживает запись до 1 МБ данных в секунду или 1000 записей в секунду. При чтении каждый сегмент поддерживает вывод до 2 МБ данных в секунду. Вы можете выбрать изначальное количество сегментов для вашего потока, а также поменять это значение позже. Увеличение количества выделенных на поток сегментов позволит вашему приложению с лёгкостью масштабироваться от тысяч записей до миллионов записей в секунду.
Отправка потоковых данных
Отправители (producers) потоковых данных – это процессы, которые добавляют записи в поток Kinesis путём вызова API putRecord для создания одной записи или API putRecords для создания нескольких записей за один вызов. Для отправки потоковых данных можно использовать инструменты AWS напрямую, например:
- AWS SDK, который упрощает аутентификацию и работу с другими особенностями вызовов API-методов, предоставляемых сервисами AWS;
- Amazon Kinesis Agent, который обеспечивает мониторинг локальных файлов (например, лог-файлов), их ротацию и отправку данных из них в реальном времени;
- Amazon Kinesis Producer Library, который помогает агрегировать отдельные записи в более крупные пакеты для повышения пропускной способности.
Кроме того, некоторые сервисы AWS также могут выступать отправителями данных в Amazon Kinesis:
Есть также несколько сторонних сервисов, предлагающих встроенную интеграцию с Amazon Kinesis, в том числе:
Независимо от того, какой инструмент для отправки данных вы выберете, они все добавляют записи в поток Kinesis Data Stream, отправляя ключ сегмента (partition key), название потока и сами данные: всё вместе не должно превышать в размере 1 МБ. Ключ сегмента определяет, в какой сегмент потока должны быть записаны данные. Amazon Kinesis Data Streams гарантирует порядок сообщений в каждом отдельном сегменте с помощью порядковых номеров, которые используются для отслеживания уникальной позиции каждого полученного сообщения.
Получение потоковых данных
Как только данные записаны в поток Kinesis Data Stream, они накапливаются в соответствующих сегментах для последующего получения. В отличие от обработки с использованием очередей, записи не удаляются до истечения срока их хранения, который можно настроить для каждого потока. Это значит, что каждый получатель (consumer) данных может воспроизвести все сообщения в сегментах потока. Если вашему приложению необходимо доставить записи в озеро данных, хранилище данных, кластер Amazon Elasticsearch Service или Splunk, то Kinesis Data Firehose может осуществить такую доставку без необходимости написания какого-либо кода в следующие сервисы:
- Amazon S3
- Amazon Redshift
- Amazon Elasticsearch Service
- Splunk
Вы просто указываете желаемое место назначения для сохранения записей и указываете настройки пакетирования и доставки сообщений. Кроме того, Kinesis Data Firehose позволяет задавать формат наименования объектов в S3, название таблиц в Amazon Redshift, название индексов в Amazon Elasticsearch и т. д.
Для настраиваемой обработки записей или для использования других мест доставки, кроме поддерживаемых в Amazon Kinesis Data Firehose, как указано выше, вам необходимо создать и запустить свой код для получения данных из потока. Хоть вы и можете использовать Kinesis Client Library (KCL) для выполнения ваших приложений на постоянно запущенных виртуальных машинах или контейнерах, AWS Lambda предоставляет бессерверный метод запуска программного кода с встроенной интеграцией с Amazon Kinesis Data Streams. Использование AWS Lambda в качестве получателя потоковых данных помогает избавиться от накладных расходов, связанных с чтением из сегментов потока, поддержанием порядка записей, созданием контрольных точек и распараллеливанием обработки.
Бессерверная обработка потоковых данных с помощью AWS Lambda
При использовании потока Kinesis в качестве источника событий AWS Lambda постоянно опрашивает каждый сегмент вашего потока без дополнительной оплаты, и вызывает ваш программный код только тогда, когда в потоке есть сообщения для обработки. Сервис увеличивает количество одновременных запусков кода для параллельного чтения из всех сегментов потока (а также, если требуется, может запускать несколько обработчиков для каждого сегмента одновременно). AWS Lambda автоматически создаёт контрольные точки, показывающие, какие записи были успешно обработаны, и осуществляет повторные попытки, а также обработку сбоев в соответствии с заданными вами настройками.
Лучше всего то, что сервис Lambda осуществляет эти задачи за вас без дополнительной оплаты. Вы платите только за вычислительные ресурсы и время выполнения вашей функции, когда в потоке были сообщения. В вашем программном коде вы можете сосредоточиться на обработке данных в соответствии с необходимой бизнес-логикой — записи передаются в Lambda в виде массива, и вам не нужно создавать и поддерживать дополнительный код для управления контрольными точками, разделения или слияния сегментов потока данных, и других сложных задач.
Заключение
В этом посте мы определили, что такое потоковые данные, и рассмотрели сервисы Amazon Kinesis и различные возможности, поддерживаемые ими. Затем мы рассмотрели варианты отправки и получения потоковых данных в режиме реального времени с помощью Amazon Kinesis, включая использование AWS Lambda для бессерверной обработки. Вы можете узнать больше об обработке потоковых данных в AWS из следующих источников:
- Serverless Stream Processing Pipeline Best Practices
- Serverless Streams, Messaging, and APIs – How to Pick the Right Serverless Application Pattern
- Serverless Streaming Data Processing Hands-on Workshop
Другие статьи серии
Теперь, когда вы познакомились с управляемыми сервисами для работы с потоковыми данными, обязательно прочитайте и другие посты в этой серии: