|
@@ -24,6 +24,7 @@ import java.io.PrintWriter;
|
|
|
import java.nio.charset.Charset;
|
|
|
import java.text.DecimalFormat;
|
|
|
import java.util.Collection;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.EnumSet;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
@@ -39,11 +40,14 @@ import org.apache.hadoop.classification.InterfaceAudience.Private;
|
|
|
import org.apache.hadoop.classification.InterfaceStability.Unstable;
|
|
|
import org.apache.hadoop.util.StringUtils;
|
|
|
import org.apache.hadoop.util.ToolRunner;
|
|
|
+import org.apache.hadoop.yarn.api.protocolrecords.UpdateApplicationTimeoutsRequest;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptReport;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationReport;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationResourceUsageReport;
|
|
|
+import org.apache.hadoop.yarn.api.records.ApplicationTimeout;
|
|
|
+import org.apache.hadoop.yarn.api.records.ApplicationTimeoutType;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerReport;
|
|
|
import org.apache.hadoop.yarn.api.records.Priority;
|
|
@@ -53,7 +57,6 @@ import org.apache.hadoop.yarn.exceptions.ApplicationAttemptNotFoundException;
|
|
|
import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
|
|
|
import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException;
|
|
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
|
-import org.apache.hadoop.yarn.util.ConverterUtils;
|
|
|
import org.apache.hadoop.yarn.util.Times;
|
|
|
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
@@ -84,6 +87,7 @@ public class ApplicationCLI extends YarnCLI {
|
|
|
public static final String CONTAINER = "container";
|
|
|
public static final String APP_ID = "appId";
|
|
|
public static final String UPDATE_PRIORITY = "updatePriority";
|
|
|
+ public static final String UPDATE_LIFETIME = "updateLifetime";
|
|
|
|
|
|
private boolean allAppStates;
|
|
|
|
|
@@ -139,6 +143,9 @@ public class ApplicationCLI extends YarnCLI {
|
|
|
opts.addOption(UPDATE_PRIORITY, true,
|
|
|
"update priority of an application. ApplicationId can be"
|
|
|
+ " passed using 'appId' option.");
|
|
|
+ opts.addOption(UPDATE_LIFETIME, true,
|
|
|
+ "update timeout of an application from NOW. ApplicationId can be"
|
|
|
+ + " passed using 'appId' option. Timeout value is in seconds.");
|
|
|
Option killOpt = new Option(KILL_CMD, true, "Kills the application. "
|
|
|
+ "Set of applications can be provided separated with space");
|
|
|
killOpt.setValueSeparator(' ');
|
|
@@ -150,6 +157,7 @@ public class ApplicationCLI extends YarnCLI {
|
|
|
opts.getOption(STATUS_CMD).setArgName("Application ID");
|
|
|
opts.getOption(APP_ID).setArgName("Application ID");
|
|
|
opts.getOption(UPDATE_PRIORITY).setArgName("Priority");
|
|
|
+ opts.getOption(UPDATE_LIFETIME).setArgName("Timeout");
|
|
|
} else if (args.length > 0 && args[0].equalsIgnoreCase(APPLICATION_ATTEMPT)) {
|
|
|
title = APPLICATION_ATTEMPT;
|
|
|
opts.addOption(STATUS_CMD, true,
|
|
@@ -296,6 +304,17 @@ public class ApplicationCLI extends YarnCLI {
|
|
|
}
|
|
|
updateApplicationPriority(cliParser.getOptionValue(APP_ID),
|
|
|
cliParser.getOptionValue(UPDATE_PRIORITY));
|
|
|
+ } else if (cliParser.hasOption(UPDATE_LIFETIME)) {
|
|
|
+ if (!cliParser.hasOption(APP_ID)) {
|
|
|
+ printUsage(title, opts);
|
|
|
+ return exitCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ long timeoutInSec =
|
|
|
+ Long.parseLong(cliParser.getOptionValue(UPDATE_LIFETIME));
|
|
|
+
|
|
|
+ updateApplicationTimeout(cliParser.getOptionValue(APP_ID),
|
|
|
+ ApplicationTimeoutType.LIFETIME, timeoutInSec);
|
|
|
} else if (cliParser.hasOption(SIGNAL_CMD)) {
|
|
|
if (args.length < 3 || args.length > 4) {
|
|
|
printUsage(title, opts);
|
|
@@ -316,6 +335,22 @@ public class ApplicationCLI extends YarnCLI {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ private void updateApplicationTimeout(String applicationId,
|
|
|
+ ApplicationTimeoutType timeoutType, long timeoutInSec)
|
|
|
+ throws YarnException, IOException {
|
|
|
+ ApplicationId appId = ApplicationId.fromString(applicationId);
|
|
|
+ String newTimeout =
|
|
|
+ Times.formatISO8601(System.currentTimeMillis() + timeoutInSec * 1000);
|
|
|
+ sysout.println("Updating timeout for given timeoutType: "
|
|
|
+ + timeoutType.toString() + " of an application " + applicationId);
|
|
|
+ UpdateApplicationTimeoutsRequest request = UpdateApplicationTimeoutsRequest
|
|
|
+ .newInstance(appId, Collections.singletonMap(timeoutType, newTimeout));
|
|
|
+ client.updateApplicationTimeouts(request);
|
|
|
+ sysout.println(
|
|
|
+ "Successfully updated " + timeoutType.toString() + " of an application "
|
|
|
+ + applicationId + ". New expiry time is " + newTimeout);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Signals the containerId
|
|
|
*
|
|
@@ -678,7 +713,13 @@ public class ApplicationCLI extends YarnCLI {
|
|
|
appReportStr.print("\tApplication Node Label Expression : ");
|
|
|
appReportStr.println(appReport.getAppNodeLabelExpression());
|
|
|
appReportStr.print("\tAM container Node Label Expression : ");
|
|
|
- appReportStr.print(appReport.getAmNodeLabelExpression());
|
|
|
+ appReportStr.println(appReport.getAmNodeLabelExpression());
|
|
|
+ for (ApplicationTimeout timeout : appReport.getApplicationTimeouts()) {
|
|
|
+ appReportStr.print("\tTimeoutType : " + timeout.getTimeoutType());
|
|
|
+ appReportStr.print("\tExpiryTime : " + timeout.getExpiryTime());
|
|
|
+ appReportStr.println(
|
|
|
+ "\tRemainingTime : " + timeout.getRemainingTime() + "seconds");
|
|
|
+ }
|
|
|
} else {
|
|
|
appReportStr.print("Application with id '" + applicationId
|
|
|
+ "' doesn't exist in RM.");
|