YARN-4417. Make RM and Timeline-server REST APIs more consistent. Contributed by Wangda Tan

This commit is contained in:
Jian He 2015-12-28 15:52:45 -08:00
parent 32b3dc11eb
commit d0a22bae9b
4 changed files with 54 additions and 39 deletions

View File

@ -76,6 +76,9 @@ Release 2.9.0 - UNRELEASED
YARN-4341. add doc about timeline performance tool usage (Chang Li via
sjlee)
YARN-4417. Make RM and Timeline-server REST APIs more consistent.
(wtan via jianhe)
OPTIMIZATIONS
BUG FIXES

View File

@ -169,6 +169,9 @@
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.StatisticsItemInfo;
import org.apache.hadoop.yarn.server.security.ApplicationACLsManager;
import org.apache.hadoop.yarn.server.utils.BuilderUtils;
import org.apache.hadoop.yarn.server.webapp.WebServices;
import org.apache.hadoop.yarn.server.webapp.dao.ContainerInfo;
import org.apache.hadoop.yarn.server.webapp.dao.ContainersInfo;
import org.apache.hadoop.yarn.util.AdHocLogDumper;
import org.apache.hadoop.yarn.util.ConverterUtils;
import org.apache.hadoop.yarn.webapp.BadRequestException;
@ -182,7 +185,7 @@
@Singleton
@Path("/ws/v1/cluster")
public class RMWebServices {
public class RMWebServices extends WebServices {
private static final Log LOG =
LogFactory.getLog(RMWebServices.class.getName());
private static final String EMPTY = "";
@ -201,6 +204,7 @@ public class RMWebServices {
@Inject
public RMWebServices(final ResourceManager rm, Configuration conf) {
super(rm.getClientRMService());
this.rm = rm;
this.conf = conf;
isCentralizedNodeLabelConfiguration =
@ -335,8 +339,8 @@ public NodesInfo getNodes(@QueryParam("states") String states) {
}
}
Collection<RMNode> rmNodes = RMServerUtils.queryRMNodes(this.rm.getRMContext(),
acceptedStates);
Collection<RMNode> rmNodes = RMServerUtils.queryRMNodes(
this.rm.getRMContext(), acceptedStates);
NodesInfo nodesInfo = new NodesInfo();
for (RMNode rmNode : rmNodes) {
NodeInfo nodeInfo = new NodeInfo(rmNode, sched);
@ -617,39 +621,6 @@ public ApplicationStatisticsInfo getAppStatistics(
return appStatInfo;
}
private static Set<String> parseQueries(
Set<String> queries, boolean isState) {
Set<String> params = new HashSet<String>();
if (!queries.isEmpty()) {
for (String query : queries) {
if (query != null && !query.trim().isEmpty()) {
String[] paramStrs = query.split(",");
for (String paramStr : paramStrs) {
if (paramStr != null && !paramStr.trim().isEmpty()) {
if (isState) {
try {
// enum string is in the uppercase
YarnApplicationState.valueOf(
StringUtils.toUpperCase(paramStr.trim()));
} catch (RuntimeException e) {
YarnApplicationState[] stateArray =
YarnApplicationState.values();
String allAppStates = Arrays.toString(stateArray);
throw new BadRequestException(
"Invalid application-state " + paramStr.trim()
+ " specified. It should be one of " + allAppStates);
}
}
params.add(
StringUtils.toLowerCase(paramStr.trim()));
}
}
}
}
}
return params;
}
private static Map<YarnApplicationState, Map<String, Long>> buildScoreboard(
Set<String> states, Set<String> types) {
Map<YarnApplicationState, Map<String, Long>> scoreboard
@ -728,6 +699,40 @@ public AppAttemptsInfo getAppAttempts(@Context HttpServletRequest hsr,
return appAttemptsInfo;
}
@GET
@Path("/apps/{appid}/appattempts/{appattemptid}")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Override
public org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo getAppAttempt(@Context HttpServletRequest req,
@Context HttpServletResponse res, @PathParam("appid") String appId,
@PathParam("appattemptid") String appAttemptId) {
init(res);
return super.getAppAttempt(req, res, appId, appAttemptId);
}
@GET
@Path("/apps/{appid}/appattempts/{appattemptid}/containers")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Override
public ContainersInfo getContainers(@Context HttpServletRequest req,
@Context HttpServletResponse res, @PathParam("appid") String appId,
@PathParam("appattemptid") String appAttemptId) {
init(res);
return super.getContainers(req, res, appId, appAttemptId);
}
@GET
@Path("/apps/{appid}/appattempts/{appattemptid}/containers/{containerid}")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Override
public ContainerInfo getContainer(@Context HttpServletRequest req,
@Context HttpServletResponse res, @PathParam("appid") String appId,
@PathParam("appattemptid") String appAttemptId,
@PathParam("containerid") String containerId) {
init(res);
return super.getContainer(req, res, appId, appAttemptId, containerId);
}
@GET
@Path("/apps/{appid}/state")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@ -885,8 +890,7 @@ public Response replaceLabelsOnNode(
NodeId nid = ConverterUtils.toNodeIdWithDefaultPort(nodeId);
Map<NodeId, Set<String>> newLabelsForNode =
new HashMap<NodeId, Set<String>>();
newLabelsForNode.put(nid,
new HashSet<String>(newNodeLabelsName));
newLabelsForNode.put(nid, new HashSet<String>(newNodeLabelsName));
return replaceLabelsOnNode(newLabelsForNode, hsr,
"/nodes/nodeid/replace-labels");

View File

@ -36,11 +36,13 @@ public class AppAttemptInfo {
protected int id;
protected long startTime;
protected long finishedTime;
protected String containerId;
protected String nodeHttpAddress;
protected String nodeId;
protected String logsLink;
protected String blacklistedNodes;
protected String appAttemptId;
public AppAttemptInfo() {
}
@ -56,6 +58,7 @@ public AppAttemptInfo(ResourceManager rm, RMAppAttempt attempt, String user,
if (attempt != null) {
this.id = attempt.getAppAttemptId().getAttemptId();
this.startTime = attempt.getStartTime();
this.finishedTime = attempt.getFinishTime();
Container masterContainer = attempt.getMasterContainer();
if (masterContainer != null) {
this.containerId = masterContainer.getId().toString();
@ -75,6 +78,7 @@ public AppAttemptInfo(ResourceManager rm, RMAppAttempt attempt, String user,
}
}
}
this.appAttemptId = attempt.getAppAttemptId().toString();
}
}
@ -86,6 +90,10 @@ public long getStartTime() {
return this.startTime;
}
public long getFinishedTime() {
return this.finishedTime;
}
public String getNodeHttpAddress() {
return this.nodeHttpAddress;
}

View File

@ -1643,7 +1643,7 @@ public void verifyAppAttemptsInfo(JSONObject info, RMAppAttempt appAttempt,
String user)
throws JSONException, Exception {
assertEquals("incorrect number of elements", 7, info.length());
assertEquals("incorrect number of elements", 9, info.length());
verifyAppAttemptInfoGeneric(appAttempt, info.getInt("id"),
info.getLong("startTime"), info.getString("containerId"),