2 Stimmen

Nicht in der Lage, die Ereignisse von Log4J in Flume zu erhalten

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?

1voto

Sarge Punkte 2367

Meine Vermutung ist, dass du versuchst, Flume-Ereignisse durch Flume zu protokollieren. Ich habe dieses Problem bei anderen Anhangern gesehen, aber nicht bei dem Log4j1.

Ich würde erwägen, die log4j.properties zu ändern, um Flume-, Netty- und Avro-Ereignisse auszuschließen und zu sehen, ob das das Problem löst.

1voto

Tom Wheeler Punkte 11

Ich hatte einmal ein ähnliches Problem mit dem Flume-Appender in log4j. Das Programm würde sich aufhängen, wann immer ich versuchte, das Logger-Objekt zu instanziieren. Ich erinnere mich, dass das Problem war, dass ich nicht alle erforderlichen Bibliotheken im Klassenpfad hatte, und sobald ich sie hinzugefügt hatte, funktionierte es einwandfrei.

Ich würde empfehlen, dass Sie zunächst versuchen, Mikes einfaches Beispiel zum Laufen zu bringen. Obwohl die pom.xml dort ein einzelnes JAR mit allen Abhängigkeiten erstellt, wenn Sie sie bearbeiten, um die abhängigen JAR-Dateien in ein anderes Verzeichnis zu kopieren, gibt mir dies diese Liste:

avro-1.7.4.jar
avro-ipc-1.7.4.jar
commons-codec-1.3.jar
commons-collections-3.2.1.jar
commons-compress-1.4.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
flume-ng-log4jappender-1.4.0-cdh4.5.0.jar
flume-ng-sdk-1.4.0-cdh4.5.0.jar
hamcrest-core-1.1.jar
httpclient-4.0.1.jar
httpcore-4.0.1.jar
jackson-core-asl-1.8.8.jar
jackson-mapper-asl-1.8.8.jar
jetty-6.1.26.jar
jetty-util-6.1.26.jar
junit-4.10.jar
libthrift-0.7.0.jar
log4j-1.2.16.jar
netty-3.5.0.Final.jar
paranamer-2.3.jar
slf4j-api-1.7.2.jar
slf4j-jdk14-1.7.2.jar
snappy-java-1.0.4.1.jar
velocity-1.7.jar
xz-1.0.jar

Ein paar von diesen Bibliotheken (wie junit) sind vielleicht nicht wirklich notwendig, aber ich würde vorschlagen, zunächst alle zu verwenden, um zu sehen, ob Sie Ihr Beispiel zum Laufen bringen können, und dann mit dem Feststellen des minimal erforderlichen Satzes experimentieren.

1voto

edwardsbean Punkte 3649

Ich hatte ein ähnliches Problem, die Lösung ist:

  • Ändern Sie den root-Logger von debug auf Info-Level in der log4j.properties.

Aber ich wusste nicht, was im Inneren von Flume-ng passiert ist. Ich versuche es zu debuggen. Wenn es jemand weiß, bitte sag es mir. Danke ~~

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X