001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *   http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.hadoop.mapreduce;
019    
020    import java.io.DataInput;
021    import java.io.DataOutput;
022    import java.io.IOException;
023    
024    import org.apache.hadoop.classification.InterfaceAudience;
025    import org.apache.hadoop.classification.InterfaceStability;
026    import org.apache.hadoop.io.Writable;
027    
028    /**
029     * Status information on the current state of the Map-Reduce cluster.
030     * 
031     * <p><code>ClusterMetrics</code> provides clients with information such as:
032     * <ol>
033     *   <li>
034     *   Size of the cluster.  
035     *   </li>
036     *   <li>
037     *   Number of blacklisted and decommissioned trackers.  
038     *   </li>
039     *   <li>
040     *   Slot capacity of the cluster. 
041     *   </li>
042     *   <li>
043     *   The number of currently occupied/reserved map & reduce slots.
044     *   </li>
045     *   <li>
046     *   The number of currently running map & reduce tasks.
047     *   </li>
048     *   <li>
049     *   The number of job submissions.
050     *   </li>
051     * </ol></p>
052     * 
053     * <p>Clients can query for the latest <code>ClusterMetrics</code>, via 
054     * {@link Cluster#getClusterStatus()}.</p>
055     * 
056     * @see Cluster
057     */
058    @InterfaceAudience.Public
059    @InterfaceStability.Evolving
060    public class ClusterMetrics implements Writable {
061      private int runningMaps;
062      private int runningReduces;
063      private int occupiedMapSlots;
064      private int occupiedReduceSlots;
065      private int reservedMapSlots;
066      private int reservedReduceSlots;
067      private int totalMapSlots;
068      private int totalReduceSlots;
069      private int totalJobSubmissions;
070      private int numTrackers;
071      private int numBlacklistedTrackers;
072      private int numDecommissionedTrackers;
073    
074      public ClusterMetrics() {
075      }
076      
077      public ClusterMetrics(int runningMaps, int runningReduces,
078          int occupiedMapSlots, int occupiedReduceSlots,
079          int reservedMapSlots, int reservedReduceSlots,
080          int mapSlots, int reduceSlots, 
081          int totalJobSubmissions,
082          int numTrackers, int numBlacklistedTrackers,
083          int numDecommissionedNodes) {
084        this.runningMaps = runningMaps;
085        this.runningReduces = runningReduces;
086        this.occupiedMapSlots = occupiedMapSlots;
087        this.occupiedReduceSlots = occupiedReduceSlots;
088        this.reservedMapSlots = reservedMapSlots;
089        this.reservedReduceSlots = reservedReduceSlots;
090        this.totalMapSlots = mapSlots;
091        this.totalReduceSlots = reduceSlots;
092        this.totalJobSubmissions = totalJobSubmissions;
093        this.numTrackers = numTrackers;
094        this.numBlacklistedTrackers = numBlacklistedTrackers;
095        this.numDecommissionedTrackers = numDecommissionedNodes;
096      }
097    
098      /**
099       * Get the number of running map tasks in the cluster.
100       * 
101       * @return running maps
102       */
103      public int getRunningMaps() {
104        return runningMaps;
105      }
106      
107      /**
108       * Get the number of running reduce tasks in the cluster.
109       * 
110       * @return running reduces
111       */
112      public int getRunningReduces() {
113        return runningReduces;
114      }
115      
116      /**
117       * Get number of occupied map slots in the cluster.
118       * 
119       * @return occupied map slot count
120       */
121      public int getOccupiedMapSlots() { 
122        return occupiedMapSlots;
123      }
124      
125      /**
126       * Get the number of occupied reduce slots in the cluster.
127       * 
128       * @return occupied reduce slot count
129       */
130      public int getOccupiedReduceSlots() { 
131        return occupiedReduceSlots; 
132      }
133    
134      /**
135       * Get number of reserved map slots in the cluster.
136       * 
137       * @return reserved map slot count
138       */
139      public int getReservedMapSlots() { 
140        return reservedMapSlots;
141      }
142      
143      /**
144       * Get the number of reserved reduce slots in the cluster.
145       * 
146       * @return reserved reduce slot count
147       */
148      public int getReservedReduceSlots() { 
149        return reservedReduceSlots; 
150      }
151    
152      /**
153       * Get the total number of map slots in the cluster.
154       * 
155       * @return map slot capacity
156       */
157      public int getMapSlotCapacity() {
158        return totalMapSlots;
159      }
160      
161      /**
162       * Get the total number of reduce slots in the cluster.
163       * 
164       * @return reduce slot capacity
165       */
166      public int getReduceSlotCapacity() {
167        return totalReduceSlots;
168      }
169      
170      /**
171       * Get the total number of job submissions in the cluster.
172       * 
173       * @return total number of job submissions
174       */
175      public int getTotalJobSubmissions() {
176        return totalJobSubmissions;
177      }
178      
179      /**
180       * Get the number of active trackers in the cluster.
181       * 
182       * @return active tracker count.
183       */
184      public int getTaskTrackerCount() {
185        return numTrackers;
186      }
187      
188      /**
189       * Get the number of blacklisted trackers in the cluster.
190       * 
191       * @return blacklisted tracker count
192       */
193      public int getBlackListedTaskTrackerCount() {
194        return numBlacklistedTrackers;
195      }
196      
197      /**
198       * Get the number of decommissioned trackers in the cluster.
199       * 
200       * @return decommissioned tracker count
201       */
202      public int getDecommissionedTaskTrackerCount() {
203        return numDecommissionedTrackers;
204      }
205    
206      @Override
207      public void readFields(DataInput in) throws IOException {
208        runningMaps = in.readInt();
209        runningReduces = in.readInt();
210        occupiedMapSlots = in.readInt();
211        occupiedReduceSlots = in.readInt();
212        reservedMapSlots = in.readInt();
213        reservedReduceSlots = in.readInt();
214        totalMapSlots = in.readInt();
215        totalReduceSlots = in.readInt();
216        totalJobSubmissions = in.readInt();
217        numTrackers = in.readInt();
218        numBlacklistedTrackers = in.readInt();
219        numDecommissionedTrackers = in.readInt();
220      }
221    
222      @Override
223      public void write(DataOutput out) throws IOException {
224        out.writeInt(runningMaps);
225        out.writeInt(runningReduces);
226        out.writeInt(occupiedMapSlots);
227        out.writeInt(occupiedReduceSlots);
228        out.writeInt(reservedMapSlots);
229        out.writeInt(reservedReduceSlots);
230        out.writeInt(totalMapSlots);
231        out.writeInt(totalReduceSlots);
232        out.writeInt(totalJobSubmissions);
233        out.writeInt(numTrackers);
234        out.writeInt(numBlacklistedTrackers);
235        out.writeInt(numDecommissionedTrackers);
236      }
237    
238    }