diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/event/AsyncDispatcher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/event/AsyncDispatcher.java index 667515d00c1..2c06607ccbe 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/event/AsyncDispatcher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/event/AsyncDispatcher.java @@ -25,7 +25,11 @@ import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import org.apache.hadoop.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder; import org.apache.hadoop.yarn.metrics.EventTypeMetrics; import org.apache.hadoop.yarn.util.Clock; import org.apache.hadoop.yarn.util.MonotonicClock; @@ -93,6 +97,9 @@ private Clock clock = new MonotonicClock(); + private ThreadPoolExecutor printEventDetailsService; + private ThreadFactory threadFactory; + /** * The thread name for dispatcher. */ @@ -179,6 +186,17 @@ protected void serviceInit(Configuration conf) throws Exception{ YARN_DISPATCHER_PRINT_EVENTS_INFO_THRESHOLD, YarnConfiguration. DEFAULT_YARN_DISPATCHER_PRINT_EVENTS_INFO_THRESHOLD); + + threadFactory = new ThreadFactoryBuilder() + .setNameFormat("PrintEventDetailsService #%d") + .build(); + // Thread pool for async print event details, + // to prevent wasting too much time for RM. + printEventDetailsService = new ThreadPoolExecutor( + 1, 5, 10, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(), threadFactory); + // This can reduce the number of running threads + printEventDetailsService.allowCoreThreadTimeOut(true); } @Override @@ -222,6 +240,7 @@ protected void serviceStop() throws Exception { LOG.warn("Interrupted Exception while stopping", ie); } } + printEventDetailsService.shutdown(); // stop all the components super.serviceStop(); @@ -301,6 +320,10 @@ private void printEventQueueDetails() { long num = entry.getValue(); LOG.info("Event type: " + entry.getKey() + ", Event record counter: " + num); + // For test + if (LOG.isTraceEnabled()) { + LOG.trace("Event type: " + entry.getKey() + " printed."); + } } } public void handle(Event event) { @@ -319,7 +342,7 @@ public void handle(Event event) { if (qSize != 0 && qSize % detailsInterval == 0 && lastEventDetailsQueueSizeLogged != qSize) { lastEventDetailsQueueSizeLogged = qSize; - printEventQueueDetails(); + printEventDetailsService.submit(this::printEventQueueDetails); printTrigger = true; } int remCapacity = eventQueue.remainingCapacity(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/event/TestAsyncDispatcher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/event/TestAsyncDispatcher.java index 7d2572a4c11..35b56e4e577 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/event/TestAsyncDispatcher.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/event/TestAsyncDispatcher.java @@ -167,6 +167,7 @@ public void testPrintDispatcherEventDetails() throws Exception { conf.setInt(YarnConfiguration. YARN_DISPATCHER_PRINT_EVENTS_INFO_THRESHOLD, 5000); Logger log = mock(Logger.class); + when(log.isTraceEnabled()).thenReturn(true); AsyncDispatcher dispatcher = new AsyncDispatcher(); dispatcher.init(conf); @@ -187,8 +188,7 @@ public void testPrintDispatcherEventDetails() throws Exception { when(event.getType()).thenReturn(TestEnum.TestEventType); dispatcher.getEventHandler().handle(event); } - verify(log, atLeastOnce()).info("Event type: TestEventType, " + - "Event record counter: 5000"); + verify(log, atLeastOnce()).trace("Event type: TestEventType printed."); Thread.sleep(2000); //Make sure more than one event to take verify(log, atLeastOnce()).