Архитектура распределенного сбора данных о показах

У меня есть веб-приложение, написанное на node.js, распределенное между несколькими веб-серверами с балансировкой нагрузки для рекламного проекта, над которым я работаю. Я пытаюсь выяснить, как лучше всего собирать и распространять данные журнала для показов объявлений, чтобы я мог проанализировать данные позже.

Мы решили хранить данные в формате Apache Avro и будем использовать Apache Spark для обработки данных. Мы выбрали Avro из-за способа доступа к данным, и он кажется наиболее подходящим.

В настоящее время у меня настроен поток Kinesis Firehose, и я использую AWS-SDK для Node.js для отправки данных Avro о каждом показе, которые затем в конечном итоге сохраняются в S3. Проблема Kinesis объединяет все файлы, которые я отправляю ему, для каждого пакета, который он записывает в S3, поэтому, если я настроил его на запись каждые 300 секунд, он поставит в очередь все файлы Avro, объединит их, а затем запишите их на S3. Полученные файлы больше не являются действительными файлами Avro, поскольку они объединены вместе.

Может быть, было бы лучше, если бы я просто отправил необработанные данные JSON в поток Kinesis, а затем другое приложение преобразовало бы данные JSON в Avro? Немного раздражает необходимость писать еще одну службу только для промежуточной обработки данных, и мне придется координировать изменения в формате исходных данных с моей службой преобразования.

Есть ли лучший подход?


person Chris Miller    schedule 27.11.2015    source источник


Ответы (1)


Потоки Kinesis будут работать, но, как вы сказали, возможно, много работы для того, что вам нужно, а затем вам понадобится служба, работающая 24x7x365, чтобы потреблять поток.

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

В зависимости от того, насколько разные для вас конкатенированные события firehose, по сравнению с тем, что нужно AVRO, это может быть лишь незначительное преобразование, и, поскольку вы уже кодируете в nodejs, написание функции Lamba nodejs для преобразования данных должно быть довольно простым для вас.

person E.J. Brennan    schedule 27.11.2015