Стандартный вывод Flume в IRC

Я пытаюсь объединить выходные данные каждого узла в кластерном приложении в легкодоступном месте. Мне не нужно, чтобы данные хранились постоянно, я просто хочу видеть весь стандартный вывод в одном месте. В конце концов я захочу хранить гораздо меньше информации, возможно, используя файлы журналов, но сейчас я просто хочу app -> stdOut -> IRC, и flume кажется хорошим выбором для этого.

Все примеры, которые я видел с использованием исходного кода exec, показывают команду, использующую tail, хотя в документации создается впечатление, что вы можете использовать любой процесс, который выводит стандартный вывод. Моя конфигурация (см. ниже) запускает мое приложение как команду, но для устранения неполадок он запускает простой сценарий оболочки, который повторяет «тест» через заданные интервалы времени.

У меня все работает, и приемник IRC присоединяется к каналу IRC, но никогда не отправляет никаких сообщений. Последняя запись в журнале — запуск Exec.

Изменить: версия flume flume-ng-1.2.0+24.43-1~squeeze

Flume.config:

agent.sources = exec1
agent.channels = mem1
agent.sinks = irc1
agent.sources.exec1.type = exec
agent.sources.exec1.command = sh /var/lib/app/test.sh
agent.sources.exec1.channels = mem1
agent.sinks.irc1.type = irc
agent.sinks.irc1.hostname = 192.168.17.16
agent.sinks.irc1.nick = flume
agent.sinks.irc1.chan = agents
agent.sinks.irc1.channel = mem1
agent.channels.mem1.type = memory
agent.channels.mem1.capacity = 100

log4j.Свойства:

flume.root.logger=INFO,LOGFILE
flume.log.dir=/var/log/flume-ng
flume.log.file=flume.log
log4j.logger.org.apache.flume.lifecycle = INFO
log4j.logger.org.jboss = WARN
log4j.logger.org.mortbay = INFO
log4j.logger.org.apache.avro.ipc.NettyTransceiver = WARN
log4j.rootLogger=${flume.root.logger}
log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE.MaxFileSize=100MB
log4j.appender.LOGFILE.MaxBackupIndex=10
log4j.appender.LOGFILE.File=${flume.log.dir}/${flume.log.file}
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d (%t) [%p - %l] %m%n

тест.ш:

#!/bin/bash
x=1
while [ $x -ge 1 ]
do
  echo "Test $x"
  x=$(( $x + 1 ))
  sleep 5
done

Flume.log:

2013-01-31 12:45:08,184 INFO nodemanager.DefaultLogicalNodeManager: Node manager starting
2013-01-31 12:45:08,184 INFO properties.PropertiesFileConfigurationProvider: Configuration provider starting
2013-01-31 12:45:08,184 INFO lifecycle.LifecycleSupervisor: Starting lifecycle supervisor 9
2013-01-31 12:45:08,186 INFO properties.PropertiesFileConfigurationProvider: Reloading configuration file:/etc/flume-ng/conf/flume.conf
2013-01-31 12:45:08,194 INFO conf.FlumeConfiguration: Processing:irc1
2013-01-31 12:45:08,194 INFO conf.FlumeConfiguration: Added sinks: irc1 Agent: agent
2013-01-31 12:45:08,194 INFO conf.FlumeConfiguration: Processing:irc1
2013-01-31 12:45:08,194 INFO conf.FlumeConfiguration: Processing:irc1
2013-01-31 12:45:08,194 INFO conf.FlumeConfiguration: Processing:irc1
2013-01-31 12:45:08,194 INFO conf.FlumeConfiguration: Processing:irc1
2013-01-31 12:45:08,207 INFO conf.FlumeConfiguration: Post-validation flume configuration contains configuration  for agents: [agent]
2013-01-31 12:45:08,208 INFO properties.PropertiesFileConfigurationProvider: Creating channels
2013-01-31 12:45:08,249 INFO instrumentation.MonitoredCounterGroup: Monitoried counter group for type: CHANNEL, name: mem1, registered successfully.
2013-01-31 12:45:08,249 INFO properties.PropertiesFileConfigurationProvider: created channel mem1
2013-01-31 12:45:08,262 INFO sink.DefaultSinkFactory: Creating instance of sink: irc1, type: irc
2013-01-31 12:45:08,266 INFO nodemanager.DefaultLogicalNodeManager: Starting new configuration:{ sourceRunners:{exec1=EventDrivenSourceRunner: { source:org.apache.flume.source.ExecSource@498665a0 }} sinkRunners:{irc1=SinkRunner: { policy:org.apache.flume.sink.DefaultSinkProcessor@167a1116 counterGroup:{ name:null counters:{} } }} channels:{mem1=org.apache.flume.channel.MemoryChannel@27f7c6e1} }
2013-01-31 12:45:08,266 INFO nodemanager.DefaultLogicalNodeManager: Starting Channel mem1
2013-01-31 12:45:08,266 INFO instrumentation.MonitoredCounterGroup: Component type: CHANNEL, name: mem1 started
2013-01-31 12:45:08,266 INFO nodemanager.DefaultLogicalNodeManager: Starting Sink irc1
2013-01-31 12:45:08,267 INFO irc.IRCSink: IRC sink starting
2013-01-31 12:45:08,267 INFO nodemanager.DefaultLogicalNodeManager: Starting Source exec1
2013-01-31 12:45:08,267 INFO source.ExecSource: Exec source starting with command:sh /var/lib/app/test.sh

Размер пакета Edit, по-видимому, был проблемой, так как он ждал до 20 сообщений (по умолчанию?), что составляло 100 секунд, прежде чем я увидел какой-либо вывод. Теперь, когда размер партии = 1, стандартный регистратор выводит результаты, но IRC жалуется на исключение NullPointerException, вероятно, потому, что Event.body каким-то образом имеет значение null?


person QuickDanger    schedule 31.01.2013    source источник


Ответы (1)


Документация для приемников IRC (находится здесь: Руководство пользователя Flume 1.x) неправильно говорить, что splitlines не требуется настраивать. В коде у него нет значения по умолчанию, поэтому его необходимо настроить.

Глядя на исходный код (найден здесь: IRCSink.java), вы также должны указать "разделенные линии", иначе возникнет исключение NullPointerException. Существует код для обработки "разделителей", равных нулю, но не разделяемых строк. Сообщается как FLUME-1892 (Изменить: этот тикет было решено в январе. Это больше не должно быть проблемой.)

person QuickDanger    schedule 31.01.2013