From c5a3ec493b8ad2fdec8a23e078c5914317d7b7c5 Mon Sep 17 00:00:00 2001 From: Wei-Chiu Chuang Date: Thu, 17 Nov 2016 22:17:23 -0600 Subject: [PATCH] YARN-5271. ATS client doesn't work with Jersey 2 on the classpath. Contributed by Weiwei Yang. (cherry picked from commit 09520cb439f8b002e3f2f3d8f5080ffc34f4bd5c) --- .../yarn/client/api/impl/YarnClientImpl.java | 23 +++++++++++++++---- .../yarn/client/api/impl/TestYarnClient.java | 21 +++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java index 57f50c46771..f0fce22c841 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/impl/YarnClientImpl.java @@ -167,11 +167,24 @@ public class YarnClientImpl extends YarnClient { if (conf.getBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, YarnConfiguration.DEFAULT_TIMELINE_SERVICE_ENABLED)) { - timelineServiceEnabled = true; - timelineClient = createTimelineClient(); - timelineClient.init(conf); - timelineDTRenewer = getTimelineDelegationTokenRenewer(conf); - timelineService = TimelineUtils.buildTimelineTokenService(conf); + try { + timelineServiceEnabled = true; + timelineClient = createTimelineClient(); + timelineClient.init(conf); + timelineDTRenewer = getTimelineDelegationTokenRenewer(conf); + timelineService = TimelineUtils.buildTimelineTokenService(conf); + } catch (NoClassDefFoundError error) { + // When attempt to initiate the timeline client with + // different set of dependencies, it may fail with + // NoClassDefFoundError. When some of them are not compatible + // with timeline server. This is not necessarily a fatal error + // to the client. + LOG.warn("Timeline client could not be initialized " + + "because dependency missing or incompatible," + + " disabling timeline client.", + error); + timelineServiceEnabled = false; + } } // The AHSClientService is enabled by default when we start the diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java index 9b61dcbb780..ac84cc0ea92 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.client.api.impl; +import static org.junit.Assert.assertFalse; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -155,6 +156,26 @@ public class TestYarnClient { rm.stop(); } + @Test + public void testTimelineClientInitFailure() throws Exception{ + Configuration conf = new Configuration(); + conf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, true); + YarnClient client = YarnClient.createYarnClient(); + if(client instanceof YarnClientImpl) { + YarnClientImpl impl = (YarnClientImpl) client; + YarnClientImpl spyClient = spy(impl); + when(spyClient.createTimelineClient()).thenThrow( + new NoClassDefFoundError( + "Mock a failure when init timeline instance")); + spyClient.init(conf); + spyClient.start(); + assertFalse("Timeline client should be disabled when" + + "it is failed to init", + spyClient.timelineServiceEnabled); + spyClient.stop(); + } + } + @SuppressWarnings("deprecation") @Test (timeout = 30000) public void testSubmitApplication() throws Exception {