From f657b54281d517c69df0a23b97b47befa77d1dc2 Mon Sep 17 00:00:00 2001 From: Jason Lowe Date: Tue, 12 Jan 2016 23:56:23 +0000 Subject: [PATCH] MAPREDUCE-6473. Job submission can take a long time during Cluster initialization. Contributed by Kuhu Shukla --- hadoop-mapreduce-project/CHANGES.txt | 3 + .../org/apache/hadoop/mapreduce/Cluster.java | 69 +++++++++++-------- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/hadoop-mapreduce-project/CHANGES.txt b/hadoop-mapreduce-project/CHANGES.txt index 20fc08b78f8..fa5c086616a 100644 --- a/hadoop-mapreduce-project/CHANGES.txt +++ b/hadoop-mapreduce-project/CHANGES.txt @@ -468,6 +468,9 @@ Release 2.8.0 - UNRELEASED MAPREDUCE-6394. Speed up Task processing loop in HsTasksBlock#render() (Ray Chiang via jlowe) + MAPREDUCE-6473. Job submission can take a long time during Cluster + initialization (Kuhu Shukla via jlowe) + BUG FIXES MAPREDUCE-6314. TestPipeApplication fails on trunk. diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/Cluster.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/Cluster.java index fc228e63a3f..9563c0b62d0 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/Cluster.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/Cluster.java @@ -66,7 +66,23 @@ public static enum JobTrackerStatus {INITIALIZING, RUNNING}; private static ServiceLoader frameworkLoader = ServiceLoader.load(ClientProtocolProvider.class); - + private volatile List providerList = null; + + private void initProviderList() { + if (providerList == null) { + synchronized (frameworkLoader) { + if (providerList == null) { + List localProviderList = + new ArrayList(); + for (ClientProtocolProvider provider : frameworkLoader) { + localProviderList.add(provider); + } + providerList = localProviderList; + } + } + } + } + static { ConfigUtil.loadResources(); } @@ -85,34 +101,31 @@ public Cluster(InetSocketAddress jobTrackAddr, Configuration conf) private void initialize(InetSocketAddress jobTrackAddr, Configuration conf) throws IOException { - synchronized (frameworkLoader) { - for (ClientProtocolProvider provider : frameworkLoader) { - LOG.debug("Trying ClientProtocolProvider : " - + provider.getClass().getName()); - ClientProtocol clientProtocol = null; - try { - if (jobTrackAddr == null) { - clientProtocol = provider.create(conf); - } else { - clientProtocol = provider.create(jobTrackAddr, conf); - } - - if (clientProtocol != null) { - clientProtocolProvider = provider; - client = clientProtocol; - LOG.debug("Picked " + provider.getClass().getName() - + " as the ClientProtocolProvider"); - break; - } - else { - LOG.debug("Cannot pick " + provider.getClass().getName() - + " as the ClientProtocolProvider - returned null protocol"); - } - } - catch (Exception e) { - LOG.info("Failed to use " + provider.getClass().getName() - + " due to error: ", e); + initProviderList(); + for (ClientProtocolProvider provider : providerList) { + LOG.debug("Trying ClientProtocolProvider : " + + provider.getClass().getName()); + ClientProtocol clientProtocol = null; + try { + if (jobTrackAddr == null) { + clientProtocol = provider.create(conf); + } else { + clientProtocol = provider.create(jobTrackAddr, conf); } + + if (clientProtocol != null) { + clientProtocolProvider = provider; + client = clientProtocol; + LOG.debug("Picked " + provider.getClass().getName() + + " as the ClientProtocolProvider"); + break; + } else { + LOG.debug("Cannot pick " + provider.getClass().getName() + + " as the ClientProtocolProvider - returned null protocol"); + } + } catch (Exception e) { + LOG.info("Failed to use " + provider.getClass().getName() + + " due to error: ", e); } }