You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@flume.apache.org by Hedi BOUFAIED <he...@amadeus.com> on 2016/01/08 17:48:54 UTC

Client JVM hangs with Flume1.6 log4j appender

Hello everyone,

I am facing an issue with Flume 1.6 using the log4j flume appender and I am looking for some help.

The picture is:
[CLIENT JVM : LOG4J -> FLUME-LOG4J-APPENDER ]---> [FLUME JVM : AVRO-SRC -> MEM CHANNEL -> LOGGER SINK]

After all the logs are sent by the client's log4j appender - and received and processed correctly by the flume agent (using avro source) - the client JVM (which is a simple test) hangs forever and never exits.
When the client is recompiled and executed with the jars from Flume 1.5, it executes and terminates correctly...

An extract of the client execution with jdb seems to indicate that, with Flume 1.6 jars, after the main thread terminates, some threads related to Avro / NettyTransceiver  remain alive hung in some deadlock.
Has anyone hit this kind of issue ?
I am copying below the jdb session output, my client's java code and log4j.properties and flume.conf files.

Thanks in advance for any help you might provide !

Hedi


JDB SESSION:
---
$ jdb Main
Initializing jdb ...
> run
run Main
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: Using default maxIOWorkers
Start of main
This is a 1st log message
This is a 2nd log message
This is the 3rd and last message
End of main
suspend
All threads suspended.
> threads
Group system:
  (java.lang.ref.Reference$ReferenceHandler)0x128 Reference Handler                    cond. waiting
  (java.lang.ref.Finalizer$FinalizerThread)0x127  Finalizer                            cond. waiting
  (java.lang.Thread)0x126                         Signal Dispatcher                    running
Group main:
  (java.lang.Thread)0x293                         New I/O  worker #1                   running
  (java.lang.Thread)0x29b                         New I/O  worker #2                   running
  (java.lang.Thread)0x29c                         New I/O  worker #3                   running
  (java.lang.Thread)0x29d                         New I/O  worker #4                   running
  (java.lang.Thread)0x29e                         New I/O  worker #5                   running
  (java.lang.Thread)0x29f                         New I/O  worker #6                   running
  (java.lang.Thread)0x2a0                         New I/O  worker #7                   running
  (java.lang.Thread)0x2a1                         New I/O  worker #8                   running
  (java.lang.Thread)0x31f                         Avro NettyTransceiver Boss 1         cond. waiting
  (java.lang.Thread)0x320                         Hashed wheel timer #1                sleeping
  (java.lang.Thread)0x4bd                         Flume Avro RPC Client Call Invoker 1 cond. waiting
  (java.lang.Thread)0x535                         Flume Avro RPC Client Call Invoker 2 cond. waiting
  (java.lang.Thread)0x536                         DestroyJavaVM                        running
---

Client source code and log4j.properties:
---
import org.apache.log4j.Logger;
class Main {
    final static Logger logger = Logger.getLogger(Main.class);
    public static void main(String[] args) {
        System.out.println("Start of main");
        logger.warn("This is a 1st log message");
        logger.warn("This is a 2nd log message");
        logger.warn("This is the 3rd and last log message");
        System.out.println("End of main");
    }
}
---
log4j.rootLogger=INFO, stdout, flume

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%m%n

log4j.appender.flume=org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.Port=5554
log4j.appender.flume.Hostname=localhost
log4j.appender.flume.layout=org.apache.log4j.PatternLayout
log4j.appender.flume.layout.ConversionPattern=%m/%n
---

Flume.conf file:
---
agent.sources = avroSource
agent.channels = logChannel
agent.sinks = loggerSink

agent.sources.avroSource.type = avro
agent.sources.avroSource.bind = 0.0.0.0
agent.sources.avroSource.port = 5554
agent.sources.avroSource.channels = logChannel

agent.sinks.loggerSink.type = logger
agent.sinks.loggerSink.channel = logChannel

agent.channels.logChannel.type = memory
agent.channels.logChannel.capacity = 100
---
END