Почему источник Flume должен распознавать формат сообщения?

Согласно документации Flume из здесь

Источник Flume использует события, доставленные ему внешним источником, таким как веб-сервер. Внешний источник отправляет события в Flume в формате, распознаваемом целевым источником Flume. Например, источник Avro Flume можно использовать для получения событий Avro от клиентов Avro или других агентов Flume в потоке, который отправляет события из приемника Avro.

Почему источник Flume должен распознавать или понимать формат сообщения? Хотя все, что он делает, это пересылает сообщение на один из каналов.


person Praveen Sripati    schedule 22.10.2013    source источник


Ответы (1)


Из того, что я узнал, Flume инкапсулирует передаваемые данные в пакет событий, созданный заголовком и полезной нагрузкой (передаваемые данные). Из документации:

Событие Flume определяется как единица потока данных, имеющая полезные данные в байтах и ​​необязательный набор строковых атрибутов.

Непосредственно перед цитированием вашей документации.

Указанный вами формат является форматом пакета событий, а не форматом ваших данных.

Предположим, у вас есть этот агент:

plain_to_avro_translator.sources = plain-source avro-source
plain_to_avro_translator.sinks = avro-sink local-file-sink
plain_to_avro_translator.channels = mem-channel1 mem-channel2

plain_to_avro_translator.sources.plain-source.channels = mem-channel1
plain_to_avro_translator.sources.plain-source.type = exec
plain_to_avro_translator.sources.plain-source.restart = true
plain_to_avro_translator.sources.plain-source.restartThrottle = 40000
plain_to_avro_translator.sources.plain-source.command = cat /home/user/data.log

plain_to_avro_translator.sinks.avro-sink.channel = mem-channel1
plain_to_avro_translator.sinks.avro-sink.type = thrift
plain_to_avro_translator.sinks.avro-sink.hostname = 192.168.200.43
plain_to_avro_translator.sinks.avro-sink.port = 6000

plain_to_avro_translator.channels.mem-channel1.type = memory
plain_to_avro_translator.channels.mem-channel1.capacity = 100
plain_to_avro_translator.channels.mem-channel1.transactionCapacity = 100

plain_to_avro_translator.sources.avro-source.channels = mem-channel2
plain_to_avro_translator.sources.avro-source.type = thrift
plain_to_avro_translator.sources.avro-source.bind = 0.0.0.0
plain_to_avro_translator.sources.avro-source.port = 6000

plain_to_avro_translator.channels.mem-channel2.type = memory
plain_to_avro_translator.channels.mem-channel2.capacity = 100
plain_to_avro_translator.channels.mem-channel2.transactionCapacity = 100

plain_to_avro_translator.sinks.local-file-sink.channel = mem-channel2
plain_to_avro_translator.sinks.local-file-sink.type = file_roll
plain_to_avro_translator.sinks.local-file-sink.sink.directory = /home/user/flume_output

Это будет работать без проблем и не зависит от формата data.log (вы можете написать все, что вам нужно и в любом формате). Если вы попытаетесь установить тип avro-sink на avro вместо thrift, вы получите ошибки от avro-source, потому что он ожидает события формата thrift.

Приемник и источник должны знать, как анализировать пакет событий.

Надеюсь, я получил это хорошо. Пожалуйста, поправьте меня, если я ошибаюсь.

person Bino    schedule 20.08.2018