Ich versuche, die Ereignisse von Log4J 1x über Flume in HDFS zu erhalten, indem ich den Log4J Flume-Appender verwende. Erstellt wurden zwei Appender FILE und Flume. Es funktioniert für den FILE-Appender, aber mit dem Flume-Appender hängt das Programm einfach in Eclipse. Flume funktioniert ordnungsgemäß, ich kann Nachrichten an die Avro-Quelle mit dem Avro-Client senden und die Nachrichten in HDFS sehen. Aber es integriert sich nicht mit Log4J 1x.
Ich sehe keine Ausnahme, außer der untenstehenden im log.out.
Batchgröße Zeichenkette = null
Verwendung von Netty-Bootstrap-Optionen: {tcpNoDelay=true, connectTimeoutMillis=20000}
Verbindung zu localhost/127.0.0.1:41414
[id: 0x52a00770] ÖFFNEN
und aus der Flume-Konsole
2013-10-23 14:32:32,145 (pool-5-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 => /127.0.0.1:41414] ÖFFNEN
2013-10-23 14:32:32,148 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 => /127.0.0.1:41414] GEBUNDEN: /127.0.0.1:41414
2013-10-23 14:32:32,148 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 => /127.0.0.1:41414] VERBUNDEN: /127.0.0.1:46037
2013-10-23 14:32:43,086 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 :> /127.0.0.1:41414] GETRENNT
2013-10-23 14:32:43,096 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 :> /127.0.0.1:41414] GELÖST
2013-10-23 14:32:43,096 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:171)] [id: 0x577cf6e4, /127.0.0.1:46037 :> /127.0.0.1:41414] GESCHLOSSEN
2013-10-23 14:32:43,097 (pool-6-thread-1) [INFO - org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.channelClosed(NettyServer.java:209)] Verbindung zu /127.0.0.1:46037 getrennt.
Wenn es hilft, habe ich das Programm im Debug-Modus ausgeführt und als es hängen blieb, habe ich es angehalten und den Stack-Trace gemacht. Habe versucht, den Code zu überprüfen, aber bin mir nicht sicher, warum das Programm mit dem Flume-Appender hängen bleibt.
Dämonen-Thread [Avro NettyTransceiver I/O-Worker 1] (Angehalten) Logger(Category).callAppenders(LoggingEvent) Zeile: 205
Logger(Category).forcedLog(String, Priority, Object, Throwable) Zeile: 391
Logger(Category).log(String, Priority, Object, Throwable) Zeile: 856
Log4jLoggerAdapter.debug(String) Zeile: 209
NettyTransceiver$NettyClientAvroHandler.handleUpstream(ChannelHandlerContext, ChannelEvent) Zeile: 491
DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline$DefaultChannelHandlerContext, ChannelEvent) Zeile: 564
DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(ChannelEvent) Zeile: 792
NettyTransportCodec$NettyFrameDecoder(SimpleChannelUpstreamHandler).channelBound(ChannelHandlerContext, ChannelStateEvent) Zeile: 166
NettyTransportCodec$NettyFrameDecoder(SimpleChannelUpstreamHandler).handleUpstream(ChannelHandlerContext, ChannelEvent) Zeile: 98
DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline$DefaultChannelHandlerContext, ChannelEvent) Zeile: 564
DefaultChannelPipeline.sendUpstream(ChannelEvent) Zeile: 559
Channels.fireChannelBound(Channel, SocketAddress) Zeile: 199
NioWorker$RegisterTask.run() Zeile: 191
NioWorker(AbstractNioWorker).processRegisterTaskQueue() Zeile: 329
NioWorker(AbstractNioWorker).run() Zeile: 235
NioWorker.run() Zeile: 38
DeadLockProofWorker$1.run() Zeile: 42
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) Zeile: 1145
ThreadPoolExecutor$Worker.run() Zeile: 615
Thread.run() Zeile: 744
Hier ist das Java-Programm
import java.io.IOException;
import java.sql.SQLException;
import org.apache.log4j.Logger;
public class log4jExample {
static Logger log = Logger.getRootLogger();
public static void main(String[] args) throws IOException, SQLException {
log.debug("Hallo, dies ist eine Debug-Nachricht");
}
}
Hier sind die log4j.properties
# Definiere den Root-Logger mit Appender-Datei
log = /home/vm4learning/WorkSpace/BigData/Log4J-Example/log
log4j.rootLogger = DEBUG, FILE, flume
# Definiere den Datei-Appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
# Definiere den Flume-Appender
log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.Hostname = localhost
log4j.appender.flume.Port = 41414
log4j.appender.flume.UnsafeMode = false
log4j.appender.flume.layout=org.apache.log4j.PatternLayout
log4j.appender.flume.layout.ConversionPattern=%m%n
Hier sind die Abhängigkeiten in Eclipse
flume-ng-log4jappender-1.4.0.jar
log4j-1.2.17.jar
flume-ng-sdk-1.4.0.jar
avro-1.7.3.jar
netty-3.4.0.Final.jar
avro-ipc-1.7.3.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
Hier ist der Inhalt der flume.conf
# Teilen Sie dem Agenten1 mit, welche wir aktivieren möchten.
agent1.channels = ch1
agent1.sources = avro-source1
agent1.sinks = hdfs-sink1
# Definieren Sie einen Memory Channel namens ch1 auf Agenten1
agent1.channels.ch1.type = memory
# Definieren Sie eine Avro-Quelle namens avro-source1 auf Agenten1 und geben Sie an,
# dass sie an 0.0.0.0:41414 gebunden werden soll. Verbinden Sie sie mit dem Kanal ch1.
agent1.sources.avro-source1.type = avro
agent1.sources.avro-source1.bind = 0.0.0.0
agent1.sources.avro-source1.port = 41414
# Definieren Sie ein Logger-Sink, das einfach alle empfangenen Ereignisse protokolliert
# und verbinden Sie es mit dem anderen Ende desselben Kanals.
agent1.sinks.hdfs-sink1.type = hdfs
agent1.sinks.hdfs-sink1.hdfs.path = hdfs://localhost:9000/flume/events/
agent1.sinks.hdfs-sink1.channel = ch1
agent1.sources.avro-source1.channels = ch1
Wie kann man dieses Problem umgehen?