diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/client/ApiServiceClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/client/ApiServiceClient.java index 851acbd..d5573c8 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/client/ApiServiceClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/client/ApiServiceClient.java @@ -517,6 +517,45 @@ public int actionDestroy(String appName) throws IOException, YarnException { return result; } + private Service getApp(String appName) throws IOException, YarnException { + ClientResponse response = getApiClient(getServicePath(appName)) + .get(ClientResponse.class); + if (response.getStatus() == 404) { + throw new YarnException("Service " + appName + " not found"); + } + if (response.getStatus() != 200) { + throw new YarnException(appName + " Failed: HTTP error code " + + response.getStatus()); + } + String output = response.getEntity(String.class); + Service service = jsonSerDeser.fromJson(output); + return service; + } + + // Parse the number of containers requested by user, e.g. + // +5 means add 5 additional containers + // -5 means reduce 5 containers, if it goes to negative, sets it to 0 + // 5 means sets it to 5 containers. + private long parseNumberOfContainers(Component component, String newNumber) { + + long orig = component.getNumberOfContainers(); + if (newNumber.startsWith("+")) { + return orig + Long.parseLong(newNumber.substring(1)); + } else if (newNumber.startsWith("-")) { + long ret = orig - Long.parseLong(newNumber.substring(1)); + if (ret < 0) { + LOG.warn(MessageFormat.format( + "[COMPONENT {0}]: component count goes to negative ({1}{2} = {3})," + + " ignore and reset it to 0.", + component.getName(), orig, newNumber, ret)); + ret = 0; + } + return ret; + } else { + return Long.parseLong(newNumber); + } + } + /** * Change number of containers associated with a service. * @@ -528,13 +567,15 @@ public int actionFlex(String appName, Map componentCounts) throws IOException, YarnException { int result = EXIT_SUCCESS; try { + Service origService = getApp(appName); Service service = new Service(); service.setName(appName); service.setState(ServiceState.FLEX); for (Map.Entry entry : componentCounts.entrySet()) { Component component = new Component(); component.setName(entry.getKey()); - Long numberOfContainers = Long.parseLong(entry.getValue()); + Long numberOfContainers = parseNumberOfContainers( + origService.getComponent(entry.getKey()), entry.getValue()); component.setNumberOfContainers(numberOfContainers); service.addComponent(component); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java index 42f04da..cb8a308 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java @@ -518,38 +518,13 @@ public int actionFlex(String serviceName, Map if (component == null) { throw new IllegalArgumentException(entry.getKey() + " does not exist !"); } - long numberOfContainers = - parseNumberOfContainers(component, entry.getValue()); + long numberOfContainers = Long.parseLong(entry.getValue()); componentCounts.put(compName, numberOfContainers); } flexComponents(serviceName, componentCounts, persistedService); return EXIT_SUCCESS; } - // Parse the number of containers requested by user, e.g. - // +5 means add 5 additional containers - // -5 means reduce 5 containers, if it goes to negative, sets it to 0 - // 5 means sets it to 5 containers. - private long parseNumberOfContainers(Component component, String newNumber) { - - long orig = component.getNumberOfContainers(); - if (newNumber.startsWith("+")) { - return orig + Long.parseLong(newNumber.substring(1)); - } else if (newNumber.startsWith("-")) { - long ret = orig - Long.parseLong(newNumber.substring(1)); - if (ret < 0) { - LOG.warn(MessageFormat.format( - "[COMPONENT {0}]: component count goes to negative ({1}{2} = {3})," - + " ignore and reset it to 0.", - component.getName(), orig, newNumber, ret)); - ret = 0; - } - return ret; - } else { - return Long.parseLong(newNumber); - } - } - // Called by Rest Service public Map flexByRestService(String serviceName, Map componentCounts) throws YarnException, IOException {