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 <[email protected]> Authored: Fri May 30 11:30:17 2014 -0700 Committer: Srimanth Gunturi <[email protected]> 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
