Типично ли иметь тему кафки в час или в день?

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

Если он пишется не в kafka, а в файловую систему, то легко настроить логгер на запись в файл с отметкой времени в имени файла, что автоматически разделяет логи по интервалам час/день.

Но с kafka я гуглил достаточно раз и еще не нашел примеров создания новой темы в час/день. Не создавая новую тему в час/день, я могу только представить перемещение журналов из kafka в файловую систему или hdfs через logstash/flume.

Редко ли можно выполнять пакетную обработку (в час/день) непосредственно на kafka?


person foresightyj    schedule 20.07.2017    source источник
comment
Я не уверен, что понимаю, зачем вам нужна новая тема в час/день. Почему бы не отправить все ваши журналы в одну тему и не выполнить пакетную обработку? После каждой обработки фиксированное смещение в разделах темы перемещается вперед, поэтому вы не будете повторно обрабатывать одни и те же журналы.   -  person vahid    schedule 20.07.2017
comment
Если все данные записываются в одну и ту же тему, они могут поступать в разном порядке, что означает, что CreatedTime в данных может быть неупорядоченным. Будет сложно определить границы каждого дня (хотя небольшая неточность в моем случае может быть допустима). Если есть записи в разных темах, я могу легко проверить, является ли время последнего изменения конкретной темы значительно более ранним, чем текущее время (при условии, что мой пакет запускается в 00:10 каждый день).   -  person foresightyj    schedule 20.07.2017
comment
Вы можете логически разделить тему по ключу (в этом случае ключ может быть часом дня). Kafka гарантирует, что все сообщения с одним и тем же ключом отправляются в один и тот же раздел и, следовательно, потребляются одним потоком-потребителем.   -  person Rahul    schedule 20.07.2017
comment
@Rahul, это действительно отличная идея. У меня может быть любое количество разделов, если оно больше одного, а затем по модулю часа на количество разделов. Спасибо   -  person foresightyj    schedule 20.07.2017


Ответы (1)


Kafka был разработан LinkedIn, и его роль в LinkedIn — центр агрегации журналов. Так что Kafka очень подходит для решения такого рода проблем.

Я думаю, что каждое событие (например, посещение страниц или запросы) должно быть помечено отметкой времени на вашем веб-сервере, а не в момент отправки журнала в Kafka. В частности, когда происходит событие посещения страницы, оно фактически отправляет запрос на ваш веб-сервер, а затем ваш веб-сервер обрабатывает этот запрос и возвращает ответ. Между тем, ваш веб-сервер должен регистрировать это событие с отметкой времени, и эта отметка времени является единственным подходящим моментом времени для события. О том, как зарегистрировать событие? Вы можете создать log_producer для отправки сообщения журнала в конкретную тему вашей Kafka, а не просто регистрировать это в локальном файле.

А что касается пакетной обработки журнала в час, вы можете создать 24 раздела и сделать журнал «ЧАС» в качестве ключа раздела, тогда, если вы выполняете пакетный процесс, вам просто нужно вытащить журнал раздела H, если час, который вы хотите обработать, Х . Поскольку вам просто нужно обработать последний журнал H-часа, старый журнал H был обработан и сохранен в результате работы более старого процесса.

person GuangshengZuo    schedule 21.07.2017