Мы начали объединять данные журнала событий из наших приложений, публикуя сообщения в теме Kafka. Хотя мы могли писать прямо из приложения в Kafka, мы решили рассматривать это как общую проблему и использовать агент Flume. Это обеспечивает некоторую гибкость: если мы хотим захватить что-то еще с сервера, мы могли бы просто отслеживать другой источник и публиковать в другой теме Kafka.
Мы создали файл конфигурации агента Flume для отслеживания журнала и публикации в теме Kafka:
tier1.sources = source1
tier1.channels = channel1
tier1.sinks = sink1
tier1.sources.source1.type = exec
tier1.sources.source1.command = tail -F /var/log/some_log.log
tier1.sources.source1.channels = channel1
tier1.channels.channel1.type = memory
tier1.channels.channel1.capacity = 10000
tier1.channels.channel1.transactionCapacity = 1000
tier1.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSink
tier1.sinks.sink1.topic = some_log
tier1.sinks.sink1.brokerList = hadoop01:9092,hadoop02.com:9092,hadoop03.com:9092
tier1.sinks.sink1.channel = channel1
tier1.sinks.sink1.batchSize = 20
К сожалению, в самих сообщениях не указан хост, который их сгенерировал. Если у нас есть приложение, работающее на нескольких хостах, и возникает ошибка, у нас нет возможности выяснить, какой хост сгенерировал сообщение.
Я заметил, что если бы Flume писал напрямую в HDFS, мы могли бы использовать перехватчик Flume для записи в определенное место HDFS. Хотя мы, вероятно, могли бы сделать что-то подобное с Kafka, то есть создать новую тему для каждого сервера, это может стать громоздким. В итоге у нас были бы тысячи тем.
Может ли Flume добавлять / включать имя хоста исходного хоста при публикации в теме Kafka?