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

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.mapred.lib.aggregate;
  19. import java.lang.reflect.Constructor;
  20. import java.util.ArrayList;
  21. import java.util.Map.Entry;
  22. import org.apache.hadoop.io.Text;
  23. import org.apache.hadoop.mapred.JobConf;
  24. /**
  25.  * This class implements a wrapper for a user defined value aggregator descriptor.
  26.  * It servs two functions: One is to create an object of ValueAggregatorDescriptor from the
  27.  * name of a user defined class that may be dynamically loaded. The other is to
  28.  * deligate inviokations of generateKeyValPairs function to the created object.
  29.  * 
  30.  */
  31. public class UserDefinedValueAggregatorDescriptor implements
  32.     ValueAggregatorDescriptor {
  33.   private String className;
  34.   private ValueAggregatorDescriptor theAggregatorDescriptor = null;
  35.   private static final Class[] argArray = new Class[] {};
  36.   /**
  37.    * Create an instance of the given class
  38.    * @param className the name of the class
  39.    * @return a dynamically created instance of the given class 
  40.    */
  41.   public static Object createInstance(String className) {
  42.     Object retv = null;
  43.     try {
  44.       ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  45.       Class<?> theFilterClass = Class.forName(className, true, classLoader);
  46.       Constructor meth = theFilterClass.getDeclaredConstructor(argArray);
  47.       meth.setAccessible(true);
  48.       retv = meth.newInstance();
  49.     } catch (Exception e) {
  50.       throw new RuntimeException(e);
  51.     }
  52.     return retv;
  53.   }
  54.   private void createAggregator(JobConf job) {
  55.     if (theAggregatorDescriptor == null) {
  56.       theAggregatorDescriptor = (ValueAggregatorDescriptor) createInstance(this.className);
  57.       theAggregatorDescriptor.configure(job);
  58.     }
  59.   }
  60.   /**
  61.    * 
  62.    * @param className the class name of the user defined descriptor class
  63.    * @param job a configure object used for decriptor configuration
  64.    */
  65.   public UserDefinedValueAggregatorDescriptor(String className, JobConf job) {
  66.     this.className = className;
  67.     this.createAggregator(job);
  68.   }
  69.   /**
  70.    *   Generate a list of aggregation-id/value pairs for the given key/value pairs
  71.    *   by delegating the invocation to the real object.
  72.    *   
  73.    * @param key
  74.    *          input key
  75.    * @param val
  76.    *          input value
  77.    * @return a list of aggregation id/value pairs. An aggregation id encodes an
  78.    *         aggregation type which is used to guide the way to aggregate the
  79.    *         value in the reduce/combiner phrase of an Aggregate based job.
  80.    */
  81.   public ArrayList<Entry<Text, Text>> generateKeyValPairs(Object key,
  82.                                                           Object val) {
  83.     ArrayList<Entry<Text, Text>> retv = new ArrayList<Entry<Text, Text>>();
  84.     if (this.theAggregatorDescriptor != null) {
  85.       retv = this.theAggregatorDescriptor.generateKeyValPairs(key, val);
  86.     }
  87.     return retv;
  88.   }
  89.   /**
  90.    * @return the string representation of this object.
  91.    */
  92.   public String toString() {
  93.     return "UserDefinedValueAggregatorDescriptor with class name:" + "t"
  94.       + this.className;
  95.   }
  96.   /**
  97.    *  Do nothing.
  98.    */
  99.   public void configure(JobConf job) {
  100.   }
  101. }