You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sr...@apache.org on 2014/05/30 20:30:53 UTC

git commit: AMBARI-5962. Implement slider app flex action - APIs added. (srimanth)

Repository: ambari
Updated Branches:
  refs/heads/branch-1.6.0.slider 7acff3bb1 -> 39e428ab6


AMBARI-5962. Implement slider app flex action - APIs added. (srimanth)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/39e428ab
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/39e428ab
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/39e428ab

Branch: refs/heads/branch-1.6.0.slider
Commit: 39e428ab609d74d22a9b4dfd2c25e5c4391afdac
Parents: 7acff3b
Author: Srimanth Gunturi <sg...@hortonworks.com>
Authored: Fri May 30 11:30:17 2014 -0700
Committer: Srimanth Gunturi <sg...@hortonworks.com>
Committed: Fri May 30 11:30:17 2014 -0700

----------------------------------------------------------------------
 .../view/slider/SliderAppTypeComponent.java     |  9 +++
 .../view/slider/SliderAppsViewController.java   |  5 ++
 .../slider/SliderAppsViewControllerImpl.java    | 85 ++++++++++++++++----
 .../view/slider/rest/SliderAppsResource.java    | 13 +++
 4 files changed, 95 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/39e428ab/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppTypeComponent.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppTypeComponent.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppTypeComponent.java
index aa6c922..098ff5a 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppTypeComponent.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppTypeComponent.java
@@ -24,6 +24,7 @@ public class SliderAppTypeComponent {
 	private String category;
 	private String displayName;
 	private int priority;
+	private int minInstanceCount;
 	private int instanceCount;
 	private int maxInstanceCount;
 	private int yarnMemory;
@@ -100,4 +101,12 @@ public class SliderAppTypeComponent {
 	public void setCategory(String category) {
 		this.category = category;
 	}
+
+  public int getMinInstanceCount() {
+    return minInstanceCount;
+  }
+
+  public void setMinInstanceCount(int minInstanceCount) {
+    this.minInstanceCount = minInstanceCount;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/39e428ab/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
index 823fea6..9485ea3 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
@@ -20,6 +20,7 @@ package org.apache.ambari.view.slider;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.hadoop.yarn.exceptions.YarnException;
@@ -82,4 +83,8 @@ public interface SliderAppsViewController {
 
   public void thawApp(String appId) throws YarnException, IOException,
       InterruptedException;
+
+
+  public void flexApp(String appId, Map<String, Integer> componentsMap)
+      throws YarnException, IOException, InterruptedException;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/39e428ab/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
index f04c4a7..97919f6 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
@@ -25,6 +25,7 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+
 import org.apache.ambari.view.ViewContext;
 import org.apache.ambari.view.slider.clients.AmbariClient;
 import org.apache.ambari.view.slider.clients.AmbariCluster;
@@ -53,6 +54,7 @@ import org.apache.slider.api.ClusterDescription;
 import org.apache.slider.client.SliderClient;
 import org.apache.slider.common.SliderKeys;
 import org.apache.slider.common.params.ActionCreateArgs;
+import org.apache.slider.common.params.ActionFlexArgs;
 import org.apache.slider.common.params.ActionFreezeArgs;
 import org.apache.slider.common.params.ActionThawArgs;
 import org.apache.slider.common.tools.SliderFileSystem;
@@ -95,6 +97,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
   private List<SliderAppType> appTypes;
   private Integer createAppCounter = -1;
   private Map<String, MetricsHolder> appMetrics = new HashMap<String, MetricsHolder>();
+
   private String getAppsFolderPath() {
     return viewContext
         .getAmbariProperty(org.apache.ambari.server.configuration.Configuration.RESOURCES_DIR_KEY)
@@ -350,8 +353,10 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
               if (quickLinks != null && quickLinks.containsKey("JMX")) {
                 String jmxUrl = quickLinks.get("JMX");
                 if (matchedAppType != null) {
-                  MetricsHolder metricsHolder = appMetrics.get(matchedAppType.uniqueName());
-                  app.setJmx(sliderAppClient.getJmx(jmxUrl, viewContext, matchedAppType, metricsHolder));
+                  MetricsHolder metricsHolder = appMetrics.get(matchedAppType
+                      .uniqueName());
+                  app.setJmx(sliderAppClient.getJmx(jmxUrl, viewContext,
+                      matchedAppType, metricsHolder));
                 }
               }
               Map<String, Map<String, String>> configs = sliderAppClient
@@ -444,9 +449,10 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
         }
         if (quickLinks != null && quickLinks.containsKey("Metrics")) {
           String metricsUrl = quickLinks.get("Metrics");
-          MetricsHolder metricsHolder = appMetrics.get(matchedAppType.uniqueName());
-          app.setMetrics(
-              sliderAppClient.getGangliaMetrics(metricsUrl, gangliaMetrics, null, viewContext, matchedAppType, metricsHolder));
+          MetricsHolder metricsHolder = appMetrics.get(matchedAppType
+              .uniqueName());
+          app.setMetrics(sliderAppClient.getGangliaMetrics(metricsUrl,
+              gangliaMetrics, null, viewContext, matchedAppType, metricsHolder));
         }
       }
     }
@@ -691,10 +697,12 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
                 appTypeComponent.setName(component.getName());
                 appTypeComponent.setYarnMemory(1024);
                 appTypeComponent.setYarnCpuCores(1);
+                // Updated below if present in resources.json
+                appTypeComponent.setInstanceCount(1);
                 // appTypeComponent.setPriority(component.);
                 if (component.getMinInstanceCount() != null) {
-                  appTypeComponent.setInstanceCount(Integer.parseInt(component
-                      .getMinInstanceCount()));
+                  appTypeComponent.setMinInstanceCount(Integer
+                      .parseInt(component.getMinInstanceCount()));
                 }
                 if (component.getMaxInstanceCount() != null) {
                   appTypeComponent.setMaxInstanceCount(Integer
@@ -704,12 +712,19 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
                   JsonElement componentJson = resourcesJson.getAsJsonObject()
                       .get("components").getAsJsonObject()
                       .get(component.getName());
-                  if (componentJson != null
-                      && componentJson.getAsJsonObject().has(
-                          "yarn.role.priority")) {
-                    appTypeComponent.setPriority(Integer.parseInt(componentJson
-                        .getAsJsonObject().get("yarn.role.priority")
-                        .getAsString()));
+                  if (componentJson != null) {
+                    if (componentJson.getAsJsonObject().has(
+                        "yarn.role.priority")) {
+                      appTypeComponent.setPriority(Integer
+                          .parseInt(componentJson.getAsJsonObject()
+                              .get("yarn.role.priority").getAsString()));
+                    }
+                    if (componentJson.getAsJsonObject().has(
+                        "yarn.component.instances")) {
+                      appTypeComponent.setInstanceCount(Integer
+                          .parseInt(componentJson.getAsJsonObject()
+                              .get("yarn.component.instances").getAsString()));
+                    }
                   }
                 }
                 appTypeComponent.setCategory(component.getCategory());
@@ -717,10 +732,12 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
               }
 
               MetricsHolder metricsHolder = new MetricsHolder();
-              metricsHolder.setJmxMetrics(readMetrics(zipFile, "jmx_metrics.json"));
+              metricsHolder.setJmxMetrics(readMetrics(zipFile,
+                  "jmx_metrics.json"));
               metricsHolder.setGangliaMetrics(readMetrics(zipFile,
-                                                    "ganglia_metrics.json"));
-              appType.setSupportedMetrics(getSupportedMetrics(metricsHolder.getGangliaMetrics()));
+                  "ganglia_metrics.json"));
+              appType.setSupportedMetrics(getSupportedMetrics(metricsHolder
+                  .getGangliaMetrics()));
               appMetrics.put(appType.uniqueName(), metricsHolder);
 
               appType.setTypeComponents(appTypeComponentList);
@@ -964,4 +981,38 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
       Thread.currentThread().setContextClassLoader(currentClassLoader);
     }
   }
-}
+
+  @Override
+  public void flexApp(String appId, final Map<String, Integer> componentsMap)
+      throws YarnException, IOException, InterruptedException {
+    ClassLoader currentClassLoader = Thread.currentThread()
+        .getContextClassLoader();
+    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+    try {
+      Set<String> properties = new HashSet<String>();
+      properties.add("id");
+      properties.add("name");
+      final SliderApp sliderApp = getSliderApp(appId, properties);
+      if (sliderApp == null) {
+        throw new ApplicationNotFoundException(appId);
+      }
+      ApplicationId applicationId = UserGroupInformation.getBestUGI(null,
+          "yarn").doAs(new PrivilegedExceptionAction<ApplicationId>() {
+        public ApplicationId run() throws IOException, YarnException {
+          SliderClient sliderClient = getSliderClient();
+          ActionFlexArgs flexArgs = new ActionFlexArgs();
+          flexArgs.parameters.add(sliderApp.getName());
+          for (Entry<String, Integer> e : componentsMap.entrySet()){
+            flexArgs.componentDelegate.componentTuples.add(e.getKey());
+            flexArgs.componentDelegate.componentTuples.add(e.getValue().toString());
+          }
+          sliderClient.actionFlex(sliderApp.getName(), flexArgs);
+          return sliderClient.applicationId;
+        }
+      });
+      logger.debug("Slider app has been thawed - " + applicationId.toString());
+    } finally {
+      Thread.currentThread().setContextClassLoader(currentClassLoader);
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/39e428ab/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
index 4459db2..6cee80e 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
@@ -21,6 +21,9 @@ package org.apache.ambari.view.slider.rest;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -93,6 +96,16 @@ public class SliderAppsResource {
           else if ("RUNNING".equals(newState))
             sliderAppsViewController.thawApp(appId);
         } else if (requestJson.has("components")) {
+          Map<String, Integer> componentsMap = new HashMap<String, Integer>();
+          JsonObject componentsJson = requestJson.get("components")
+              .getAsJsonObject();
+          for (Entry<String, JsonElement> e : componentsJson.entrySet()) {
+            String componentName = e.getKey();
+            int instanceCount = e.getValue().getAsJsonObject()
+                .get("instanceCount").getAsInt();
+            componentsMap.put(componentName, instanceCount);
+          }
+          sliderAppsViewController.flexApp(appId, componentsMap);
         }
       }
       String sliderApp = sliderAppsViewController