/** * 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.hadoop.tools.rumen; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.mapreduce.JobACL; import org.apache.hadoop.security.authorize.AccessControlList; /** * This is a wrapper class around {@link LoggedJob}. This provides also the * extra information about the job obtained from job history which is not * written to the JSON trace file. */ public class ParsedJob extends LoggedJob { private static final Log LOG = LogFactory.getLog(ParsedJob.class); private Map<String, Long> totalCountersMap = new HashMap<String, Long>(); private Map<String, Long> mapCountersMap = new HashMap<String, Long>(); private Map<String, Long> reduceCountersMap = new HashMap<String, Long>(); private String jobConfPath; private Map<JobACL, AccessControlList> jobAcls; ParsedJob() { } ParsedJob(String jobID) { super(); setJobID(jobID); } /** Set the job total counters */ void putTotalCounters(Map<String, Long> totalCounters) { this.totalCountersMap = totalCounters; } /** * @return the job total counters */ public Map<String, Long> obtainTotalCounters() { return totalCountersMap; } /** Set the job level map tasks' counters */ void putMapCounters(Map<String, Long> mapCounters) { this.mapCountersMap = mapCounters; } /** * @return the job level map tasks' counters */ public Map<String, Long> obtainMapCounters() { return mapCountersMap; } /** Set the job level reduce tasks' counters */ void putReduceCounters(Map<String, Long> reduceCounters) { this.reduceCountersMap = reduceCounters; } /** * @return the job level reduce tasks' counters */ public Map<String, Long> obtainReduceCounters() { return reduceCountersMap; } /** Set the job conf path in staging dir on hdfs */ void putJobConfPath(String confPath) { jobConfPath = confPath; } /** * @return the job conf path in staging dir on hdfs */ public String obtainJobConfpath() { return jobConfPath; } /** Set the job acls */ void putJobAcls(Map<JobACL, AccessControlList> acls) { jobAcls = acls; } /** * @return the job acls */ public Map<JobACL, AccessControlList> obtainJobAcls() { return jobAcls; } /** * @return the list of map tasks of this job */ public List<ParsedTask> obtainMapTasks() { List<LoggedTask> tasks = super.getMapTasks(); return convertTasks(tasks); } /** * @return the list of reduce tasks of this job */ public List<ParsedTask> obtainReduceTasks() { List<LoggedTask> tasks = super.getReduceTasks(); return convertTasks(tasks); } /** * @return the list of other tasks of this job */ public List<ParsedTask> obtainOtherTasks() { List<LoggedTask> tasks = super.getOtherTasks(); return convertTasks(tasks); } /** As we know that this list of {@link LoggedTask} objects is actually a list * of {@link ParsedTask} objects, we go ahead and cast them. * @return the list of {@link ParsedTask} objects */ private List<ParsedTask> convertTasks(List<LoggedTask> tasks) { List<ParsedTask> result = new ArrayList<ParsedTask>(); for (LoggedTask t : tasks) { if (t instanceof ParsedTask) { result.add((ParsedTask)t); } else { throw new RuntimeException("Unexpected type of tasks in the list..."); } } return result; } /** Dump the extra info of ParsedJob */ void dumpParsedJob() { LOG.info("ParsedJob details:" + obtainTotalCounters() + ";" + obtainMapCounters() + ";" + obtainReduceCounters() + "\n" + obtainJobConfpath() + "\n" + obtainJobAcls() + ";Q=" + (getQueue() == null ? "null" : getQueue().getValue())); List<ParsedTask> maps = obtainMapTasks(); for (ParsedTask task : maps) { task.dumpParsedTask(); } List<ParsedTask> reduces = obtainReduceTasks(); for (ParsedTask task : reduces) { task.dumpParsedTask(); } List<ParsedTask> others = obtainOtherTasks(); for (ParsedTask task : others) { task.dumpParsedTask(); } } }