Какие есть варианты обработки данных таймсерий из потока Kinesis

Мне нужно обработать данные из потока AWS Kinesis, который собирает события с устройств. Функция обработки должна вызываться каждую секунду со всеми событиями, полученными за последние 10 секунд.


Скажем, у меня есть два устройства A и B, которые записывают события в поток. Моя процедура называется MyFunction и принимает следующие параметры:

  • Идентификатор устройства
  • Массив данных за период

Если я начинаю обработку в 10:00:00 (и уже накопил события для устройств A и B за последние 10 секунд), мне нужно сделать два вызова:

  • MyFunction (А, {События для устройства А с 09:59:50 до 10:00:00})
  • MyFunction (B, {События для устройства B с 09:59:50 до 10:00:00})

В следующую секунду, в 10:00:01

  • MyFunction (А, {События для устройства А с 09:59:51 до 10:00:01})
  • MyFunction (B, {События для устройства B с 09:59:51 до 10:00:01})

и так далее.


Похоже, самый простой способ накопить все данные, полученные от устройств, - это просто сохранить их в памяти во временном буфере (конечно, только за последние 10 секунд), поэтому я хотел бы сначала попробовать это.

И наиболее удобный способ сохранить такой буфер на основе памяти, который я нашел, - это создать приложение на основе клиентской библиотеки Java Kinesis (KCL).

Я также рассматривал решение на основе AWS Lambda, но похоже, что невозможно сохранить данные в памяти для лямбда. Другой вариант для Lambda - иметь 2 функции: первая должна записывать все данные в DynamoDB, а вторая вызывается каждую секунду для обработки данных, полученных из базы данных, а не из памяти. (Так что этот вариант намного сложнее)

Итак, у меня такой вопрос: какие могут быть другие варианты реализации такой обработки?


person xtx    schedule 10.05.2016    source источник


Ответы (1)


Итак, то, что вы делаете, называется «оконной операцией» (или «оконным вычислением»). Есть несколько способов добиться этого, как вы сказали, буферизация - лучший вариант.

  • В системах кэширования памяти: Ehcache, Hazelcast

Накопите данные в кэш-системе и выберите правильную политику выселения (в вашем случае 10 минут). Затем выполните операцию суммирования групп и вычислите результат.

  • В базе данных памяти: Redis, VoltDB

Подобно системе кеширования, вы можете использовать архитектуру базы данных. Redis может быть полезным и поддерживать состояние. Если вы используете VoltDB или подобную систему SQL, будет проще вызвать операцию «sum ()» или «avg ()».

Для этого подсчета можно использовать Spark. Вы можете попробовать Elastic MapReduce (EMR), чтобы остаться в экосистеме AWS и упростить интеграцию.

person az3    schedule 11.05.2016