/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ambari.view.hive20.resources.jobs.rm; import org.apache.ambari.view.hive20.resources.jobs.atsJobs.TezVertexId; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * Parser of Resource Manager responses */ public class RMParser { protected final static Logger LOG = LoggerFactory.getLogger(RMParser.class); private RMRequestsDelegate delegate; public RMParser(RMRequestsDelegate delegate) { this.delegate = delegate; } /** * Progress of DAG * @param appId App Id * @param dagId DAG Id * @return progress of DAG */ public Double getDAGProgress(String appId, String dagId) { String dagIdx = parseDagIdIndex(dagId); JSONObject progresses = delegate.dagProgress(appId, dagIdx); double dagProgressValue; if (progresses != null) { JSONObject dagProgress = (JSONObject) progresses.get("dagProgress"); dagProgressValue = (Double) (dagProgress.get("progress")); } else { LOG.error("Error while retrieving progress of " + appId + ":" + dagId + ". 0 assumed."); dagProgressValue = 0; } return dagProgressValue; } /** * Progress of vertices * @param appId App Id * @param dagId DAG Id * @param vertices vertices list * @return list of vertices */ public List<VertexProgress> getDAGVerticesProgress(String appId, String dagId, List<TezVertexId> vertices) { String dagIdx = parseDagIdIndex(dagId); Map<String, String> vertexIdToEntityMapping = new HashMap<String, String>(); StringBuilder builder = new StringBuilder(); if (vertices.size() > 0) { for (TezVertexId vertexId : vertices) { String[] parts = vertexId.entity.split("_"); String vertexIdx = parts[parts.length - 1]; builder.append(vertexIdx).append(","); vertexIdToEntityMapping.put(vertexId.entity, vertexId.vertexName); } builder.setLength(builder.length() - 1); // remove last comma } String commaSeparatedVertices = builder.toString(); List<VertexProgress> parsedVertexProgresses = new LinkedList<VertexProgress>(); JSONObject vertexProgressesResponse = delegate.verticesProgress( appId, dagIdx, commaSeparatedVertices); if (vertexProgressesResponse == null) { LOG.error("Error while retrieving progress of vertices " + appId + ":" + dagId + ":" + commaSeparatedVertices + ". 0 assumed for all vertices."); for (TezVertexId vertexId : vertices) { VertexProgress vertexProgressInfo = new VertexProgress(); vertexProgressInfo.name = vertexId.vertexName; vertexProgressInfo.progress = 0.0; parsedVertexProgresses.add(vertexProgressInfo); } return parsedVertexProgresses; } JSONArray vertexProgresses = (JSONArray) vertexProgressesResponse.get("vertexProgresses"); for (Object vertex : vertexProgresses) { JSONObject jsonObject = (JSONObject) vertex; VertexProgress vertexProgressInfo = new VertexProgress(); vertexProgressInfo.id = (String) jsonObject.get("id"); vertexProgressInfo.name = vertexIdToEntityMapping.get(vertexProgressInfo.id); vertexProgressInfo.progress = (Double) jsonObject.get("progress"); parsedVertexProgresses.add(vertexProgressInfo); } return parsedVertexProgresses; } public String parseDagIdIndex(String dagId) { String[] dagIdParts = dagId.split("_"); return dagIdParts[dagIdParts.length - 1]; } public static class VertexProgress { public String id; public String name; public Double progress; } }