Browse Source

MAPREDUCE-6951. Improve exception message when mapreduce.jobhistory.webapp.address is in wrong format. Contributed by Prabhu Joseph.

(cherry picked from commit 639f98cc9dc9fca034d0d7c26f30d5c588b9d7b8)
Rohith Sharma K S 7 years ago
parent
commit
c2b8d4b9ab

+ 10 - 3
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/main/java/org/apache/hadoop/mapreduce/v2/util/MRWebAppUtil.java

@@ -33,6 +33,7 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
+import java.util.NoSuchElementException;
 import java.util.Iterator;
 
 import static org.apache.hadoop.http.HttpConfig.Policy;
@@ -126,9 +127,15 @@ public class MRWebAppUtil {
       throws UnknownHostException {
     //construct the history url for job
     String addr = getJHSWebappURLWithoutScheme(conf);
-    Iterator<String> it = ADDR_SPLITTER.split(addr).iterator();
-    it.next(); // ignore the bind host
-    String port = it.next();
+    String port;
+    try{
+      Iterator<String> it = ADDR_SPLITTER.split(addr).iterator();
+      it.next(); // ignore the bind host
+      port = it.next();
+    } catch(NoSuchElementException e) {
+      throw new IllegalArgumentException("MapReduce JobHistory WebApp Address"
+        + " does not contain a valid host:port authority: " + addr);
+    }
     // Use hs address to figure out the host for webapp
     addr = conf.get(JHAdminConfig.MR_HISTORY_ADDRESS,
         JHAdminConfig.DEFAULT_MR_HISTORY_ADDRESS);

+ 9 - 0
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/test/java/org/apache/hadoop/mapreduce/v2/util/TestMRApps.java

@@ -54,6 +54,7 @@ import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
 import org.apache.hadoop.mapreduce.v2.api.records.TaskId;
 import org.apache.hadoop.mapreduce.v2.api.records.TaskState;
 import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
+import org.apache.hadoop.mapreduce.v2.jobhistory.JHAdminConfig;
 import org.apache.hadoop.util.ApplicationClassLoader;
 import org.apache.hadoop.util.StringUtils;
 import org.apache.hadoop.yarn.api.ApplicationConstants;
@@ -622,4 +623,12 @@ public class TestMRApps {
     assertFalse("/fake/Klass must not be a system class",
         ApplicationClassLoader.isSystemClass("/fake/Klass", systemClasses));
   }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testInvalidWebappAddress() throws Exception {
+    Configuration conf = new Configuration();
+    conf.set(JHAdminConfig.MR_HISTORY_WEBAPP_ADDRESS, "19888");
+    MRWebAppUtil.getApplicationWebURLOnJHSWithScheme(
+         conf, ApplicationId.newInstance(0, 1));
+  }
 }