From 5a9929e19bb829ebff5471c86aa57f79e88849cb Mon Sep 17 00:00:00 2001 From: Gera Shegalov Date: Sat, 28 May 2016 22:01:07 -0700 Subject: [PATCH] MAPREDUCE-6240. Hadoop client displays confusing error message. (gera) (cherry picked from commit 0af96a1c08594c809ecb254cee4f60dd22399772) --- .../org/apache/hadoop/mapreduce/Cluster.java | 15 ++++++----- .../TestClientProtocolProviderImpls.java | 26 ++++++++++++++++--- 2 files changed, 32 insertions(+), 9 deletions(-) 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 9563c0b62d0..6ca918d9147 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 @@ -102,6 +102,10 @@ public class Cluster { throws IOException { initProviderList(); + final IOException initEx = new IOException( + "Cannot initialize Cluster. Please check your configuration for " + + MRConfig.FRAMEWORK_NAME + + " and the correspond server addresses."); for (ClientProtocolProvider provider : providerList) { LOG.debug("Trying ClientProtocolProvider : " + provider.getClass().getName()); @@ -124,16 +128,15 @@ public class Cluster { + " as the ClientProtocolProvider - returned null protocol"); } } catch (Exception e) { - LOG.info("Failed to use " + provider.getClass().getName() - + " due to error: ", e); + final String errMsg = "Failed to use " + provider.getClass().getName() + + " due to error: "; + initEx.addSuppressed(new IOException(errMsg, e)); + LOG.info(errMsg, e); } } if (null == clientProtocolProvider || null == client) { - throw new IOException( - "Cannot initialize Cluster. Please check your configuration for " - + MRConfig.FRAMEWORK_NAME - + " and the correspond server addresses."); + throw initEx; } } diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/TestClientProtocolProviderImpls.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/TestClientProtocolProviderImpls.java index 6ad76e9b4fa..500e1339328 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/TestClientProtocolProviderImpls.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/TestClientProtocolProviderImpls.java @@ -18,17 +18,20 @@ package org.apache.hadoop.mapreduce; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - import java.io.IOException; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.UnsupportedFileSystemException; import org.apache.hadoop.mapred.LocalJobRunner; import org.apache.hadoop.mapred.YARNRunner; import org.apache.hadoop.mapreduce.server.jobtracker.JTConfig; +import org.apache.hadoop.util.StringUtils; import org.junit.Test; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + public class TestClientProtocolProviderImpls { @Test @@ -76,4 +79,21 @@ public class TestClientProtocolProviderImpls { "Cannot initialize Cluster. Please check")); } } + + @Test + public void testClusterExceptionRootCause() throws Exception { + final Configuration conf = new Configuration(); + conf.set(MRConfig.FRAMEWORK_NAME, MRConfig.YARN_FRAMEWORK_NAME); + conf.set(FileSystem.FS_DEFAULT_NAME_KEY, "nosuchfs:///"); + conf.set(JTConfig.JT_IPC_ADDRESS, "local"); + try { + new Cluster(conf); + fail("Cluster init should fail because of non-existing FileSystem"); + } catch (IOException ioEx) { + final String stackTrace = StringUtils.stringifyException(ioEx); + assertTrue("No root cause detected", + stackTrace.contains(UnsupportedFileSystemException.class.getName()) + && stackTrace.contains("nosuchfs")); + } + } }