Counters.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. package org.apache.hadoop.mapreduce;
  2. import java.io.DataInput;
  3. import java.io.DataOutput;
  4. import java.io.IOException;
  5. import java.util.Collection;
  6. import java.util.IdentityHashMap;
  7. import java.util.Iterator;
  8. import java.util.Map;
  9. import java.util.TreeMap;
  10. import org.apache.hadoop.io.Text;
  11. import org.apache.hadoop.io.Writable;
  12. public class Counters implements Writable,Iterable<CounterGroup> {
  13.   /**
  14.    * A cache from enum values to the associated counter. Dramatically speeds up
  15.    * typical usage.
  16.    */
  17.   private Map<Enum<?>, Counter> cache = new IdentityHashMap<Enum<?>, Counter>();
  18.   private TreeMap<String, CounterGroup> groups = 
  19.       new TreeMap<String, CounterGroup>();
  20.   
  21.   public Counters() {
  22.   }
  23.   
  24.   Counters(org.apache.hadoop.mapred.Counters counters) {
  25.     for(org.apache.hadoop.mapred.Counters.Group group: counters) {
  26.       String name = group.getName();
  27.       CounterGroup newGroup = new CounterGroup(name, group.getDisplayName());
  28.       groups.put(name, newGroup);
  29.       for(Counter counter: group) {
  30.         newGroup.addCounter(counter);
  31.       }
  32.     }
  33.   }
  34.   public Counter findCounter(String groupName, String counterName) {
  35.     CounterGroup grp = groups.get(groupName);
  36.     if (grp == null) {
  37.       grp = new CounterGroup(groupName);
  38.       groups.put(groupName, grp);
  39.     }
  40.     return grp.findCounter(counterName);
  41.   }
  42.   /**
  43.    * Find the counter for the given enum. The same enum will always return the
  44.    * same counter.
  45.    * @param key the counter key
  46.    * @return the matching counter object
  47.    */
  48.   public synchronized Counter findCounter(Enum<?> key) {
  49.     Counter counter = cache.get(key);
  50.     if (counter == null) {
  51.       counter = findCounter(key.getDeclaringClass().getName(), key.toString());
  52.       cache.put(key, counter);
  53.     }
  54.     return counter;    
  55.   }
  56.   /**
  57.    * Returns the names of all counter classes.
  58.    * @return Set of counter names.
  59.    */
  60.   public synchronized Collection<String> getGroupNames() {
  61.     return groups.keySet();
  62.   }
  63.   @Override
  64.   public Iterator<CounterGroup> iterator() {
  65.     return groups.values().iterator();
  66.   }
  67.   /**
  68.    * Returns the named counter group, or an empty group if there is none
  69.    * with the specified name.
  70.    */
  71.   public synchronized CounterGroup getGroup(String groupName) {
  72.     return groups.get(groupName);
  73.   }
  74.   /**
  75.    * Returns the total number of counters, by summing the number of counters
  76.    * in each group.
  77.    */
  78.   public synchronized  int countCounters() {
  79.     int result = 0;
  80.     for (CounterGroup group : this) {
  81.       result += group.size();
  82.     }
  83.     return result;
  84.   }
  85.   /**
  86.    * Write the set of groups.
  87.    * The external format is:
  88.    *     #groups (groupName group)*
  89.    *
  90.    * i.e. the number of groups followed by 0 or more groups, where each 
  91.    * group is of the form:
  92.    *
  93.    *     groupDisplayName #counters (false | true counter)*
  94.    *
  95.    * where each counter is of the form:
  96.    *
  97.    *     name (false | true displayName) value
  98.    */
  99.   @Override
  100.   public synchronized void write(DataOutput out) throws IOException {
  101.     out.writeInt(groups.size());
  102.     for (org.apache.hadoop.mapreduce.CounterGroup group: groups.values()) {
  103.       Text.writeString(out, group.getName());
  104.       group.write(out);
  105.     }
  106.   }
  107.   
  108.   /**
  109.    * Read a set of groups.
  110.    */
  111.   @Override
  112.   public synchronized void readFields(DataInput in) throws IOException {
  113.     int numClasses = in.readInt();
  114.     groups.clear();
  115.     while (numClasses-- > 0) {
  116.       String groupName = Text.readString(in);
  117.       CounterGroup group = new CounterGroup(groupName);
  118.       group.readFields(in);
  119.       groups.put(groupName, group);
  120.     }
  121.   }
  122.   /**
  123.    * Return textual representation of the counter values.
  124.    */
  125.   public synchronized String toString() {
  126.     StringBuilder sb = new StringBuilder("Counters: " + countCounters());
  127.     for (CounterGroup group: this) {
  128.       sb.append("nt" + group.getDisplayName());
  129.       for (Counter counter: group) {
  130.         sb.append("ntt" + counter.getDisplayName() + "=" + 
  131.                   counter.getValue());
  132.       }
  133.     }
  134.     return sb.toString();
  135.   }
  136.   /**
  137.    * Increments multiple counters by their amounts in another Counters 
  138.    * instance.
  139.    * @param other the other Counters instance
  140.    */
  141.   public synchronized void incrAllCounters(Counters other) {
  142.     for(Map.Entry<String, CounterGroup> rightEntry: other.groups.entrySet()) {
  143.       CounterGroup left = groups.get(rightEntry.getKey());
  144.       CounterGroup right = rightEntry.getValue();
  145.       if (left == null) {
  146.         left = new CounterGroup(right.getName(), right.getDisplayName());
  147.         groups.put(rightEntry.getKey(), left);
  148.       }
  149.       left.incrAllCounters(right);
  150.     }
  151.   }
  152.   public boolean equals(Object genericRight) {
  153.     if (genericRight instanceof Counters) {
  154.       Iterator<CounterGroup> right = ((Counters) genericRight).groups.
  155.                                        values().iterator();
  156.       Iterator<CounterGroup> left = groups.values().iterator();
  157.       while (left.hasNext()) {
  158.         if (!right.hasNext() || !left.next().equals(right.next())) {
  159.           return false;
  160.         }
  161.       }
  162.       return !right.hasNext();
  163.     }
  164.     return false;
  165.   }
  166.   
  167.   public int hashCode() {
  168.     return groups.hashCode();
  169.   }
  170. }