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

网格计算

开发平台:

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;
  19. import java.io.IOException;
  20. import org.apache.hadoop.fs.FileSystem;
  21. import org.apache.hadoop.io.Closeable;
  22. import org.apache.hadoop.io.SequenceFile;
  23. import org.apache.hadoop.io.compress.CompressionCodec;
  24. /** 
  25.  * Maps input key/value pairs to a set of intermediate key/value pairs.  
  26.  * 
  27.  * <p>Maps are the individual tasks which transform input records into a 
  28.  * intermediate records. The transformed intermediate records need not be of 
  29.  * the same type as the input records. A given input pair may map to zero or 
  30.  * many output pairs.</p> 
  31.  * 
  32.  * <p>The Hadoop Map-Reduce framework spawns one map task for each 
  33.  * {@link InputSplit} generated by the {@link InputFormat} for the job.
  34.  * <code>Mapper</code> implementations can access the {@link JobConf} for the 
  35.  * job via the {@link JobConfigurable#configure(JobConf)} and initialize
  36.  * themselves. Similarly they can use the {@link Closeable#close()} method for
  37.  * de-initialization.</p>
  38.  * 
  39.  * <p>The framework then calls 
  40.  * {@link #map(Object, Object, OutputCollector, Reporter)} 
  41.  * for each key/value pair in the <code>InputSplit</code> for that task.</p>
  42.  * 
  43.  * <p>All intermediate values associated with a given output key are 
  44.  * subsequently grouped by the framework, and passed to a {@link Reducer} to  
  45.  * determine the final output. Users can control the grouping by specifying
  46.  * a <code>Comparator</code> via 
  47.  * {@link JobConf#setOutputKeyComparatorClass(Class)}.</p>
  48.  *
  49.  * <p>The grouped <code>Mapper</code> outputs are partitioned per 
  50.  * <code>Reducer</code>. Users can control which keys (and hence records) go to 
  51.  * which <code>Reducer</code> by implementing a custom {@link Partitioner}.
  52.  * 
  53.  * <p>Users can optionally specify a <code>combiner</code>, via 
  54.  * {@link JobConf#setCombinerClass(Class)}, to perform local aggregation of the 
  55.  * intermediate outputs, which helps to cut down the amount of data transferred 
  56.  * from the <code>Mapper</code> to the <code>Reducer</code>.
  57.  * 
  58.  * <p>The intermediate, grouped outputs are always stored in 
  59.  * {@link SequenceFile}s. Applications can specify if and how the intermediate
  60.  * outputs are to be compressed and which {@link CompressionCodec}s are to be
  61.  * used via the <code>JobConf</code>.</p>
  62.  *  
  63.  * <p>If the job has 
  64.  * <a href="{@docRoot}/org/apache/hadoop/mapred/JobConf.html#ReducerNone">zero
  65.  * reduces</a> then the output of the <code>Mapper</code> is directly written
  66.  * to the {@link FileSystem} without grouping by keys.</p>
  67.  * 
  68.  * <p>Example:</p>
  69.  * <p><blockquote><pre>
  70.  *     public class MyMapper&lt;K extends WritableComparable, V extends Writable&gt; 
  71.  *     extends MapReduceBase implements Mapper&lt;K, V, K, V&gt; {
  72.  *     
  73.  *       static enum MyCounters { NUM_RECORDS }
  74.  *       
  75.  *       private String mapTaskId;
  76.  *       private String inputFile;
  77.  *       private int noRecords = 0;
  78.  *       
  79.  *       public void configure(JobConf job) {
  80.  *         mapTaskId = job.get("mapred.task.id");
  81.  *         inputFile = job.get("map.input.file");
  82.  *       }
  83.  *       
  84.  *       public void map(K key, V val,
  85.  *                       OutputCollector&lt;K, V&gt; output, Reporter reporter)
  86.  *       throws IOException {
  87.  *         // Process the &lt;key, value&gt; pair (assume this takes a while)
  88.  *         // ...
  89.  *         // ...
  90.  *         
  91.  *         // Let the framework know that we are alive, and kicking!
  92.  *         // reporter.progress();
  93.  *         
  94.  *         // Process some more
  95.  *         // ...
  96.  *         // ...
  97.  *         
  98.  *         // Increment the no. of &lt;key, value&gt; pairs processed
  99.  *         ++noRecords;
  100.  *
  101.  *         // Increment counters
  102.  *         reporter.incrCounter(NUM_RECORDS, 1);
  103.  *        
  104.  *         // Every 100 records update application-level status
  105.  *         if ((noRecords%100) == 0) {
  106.  *           reporter.setStatus(mapTaskId + " processed " + noRecords + 
  107.  *                              " from input-file: " + inputFile); 
  108.  *         }
  109.  *         
  110.  *         // Output the result
  111.  *         output.collect(key, val);
  112.  *       }
  113.  *     }
  114.  * </pre></blockquote></p>
  115.  *
  116.  * <p>Applications may write a custom {@link MapRunnable} to exert greater
  117.  * control on map processing e.g. multi-threaded <code>Mapper</code>s etc.</p>
  118.  * 
  119.  * @see JobConf
  120.  * @see InputFormat
  121.  * @see Partitioner  
  122.  * @see Reducer
  123.  * @see MapReduceBase
  124.  * @see MapRunnable
  125.  * @see SequenceFile
  126.  * @deprecated Use {@link org.apache.hadoop.mapreduce.Mapper} instead.
  127.  */
  128. @Deprecated
  129. public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable {
  130.   
  131.   /** 
  132.    * Maps a single input key/value pair into an intermediate key/value pair.
  133.    * 
  134.    * <p>Output pairs need not be of the same types as input pairs.  A given 
  135.    * input pair may map to zero or many output pairs.  Output pairs are 
  136.    * collected with calls to 
  137.    * {@link OutputCollector#collect(Object,Object)}.</p>
  138.    *
  139.    * <p>Applications can use the {@link Reporter} provided to report progress 
  140.    * or just indicate that they are alive. In scenarios where the application 
  141.    * takes an insignificant amount of time to process individual key/value 
  142.    * pairs, this is crucial since the framework might assume that the task has 
  143.    * timed-out and kill that task. The other way of avoiding this is to set 
  144.    * <a href="{@docRoot}/../mapred-default.html#mapred.task.timeout">
  145.    * mapred.task.timeout</a> to a high-enough value (or even zero for no 
  146.    * time-outs).</p>
  147.    * 
  148.    * @param key the input key.
  149.    * @param value the input value.
  150.    * @param output collects mapped keys and values.
  151.    * @param reporter facility to report progress.
  152.    */
  153.   void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter)
  154.   throws IOException;
  155. }