PipesReducer.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.pipes;
  19. import org.apache.commons.logging.Log;
  20. import org.apache.commons.logging.LogFactory;
  21. import org.apache.hadoop.io.Writable;
  22. import org.apache.hadoop.io.WritableComparable;
  23. import org.apache.hadoop.mapred.JobConf;
  24. import org.apache.hadoop.mapred.OutputCollector;
  25. import org.apache.hadoop.mapred.Reducer;
  26. import org.apache.hadoop.mapred.Reporter;
  27. import org.apache.hadoop.mapred.SkipBadRecords;
  28. import java.io.IOException;
  29. import java.util.Iterator;
  30. /**
  31.  * This class is used to talk to a C++ reduce task.
  32.  */
  33. class PipesReducer<K2 extends WritableComparable, V2 extends Writable,
  34.     K3 extends WritableComparable, V3 extends Writable>
  35.     implements Reducer<K2, V2, K3, V3> {
  36.   private static final Log LOG= LogFactory.getLog(PipesReducer.class.getName());
  37.   private JobConf job;
  38.   private Application<K2, V2, K3, V3> application = null;
  39.   private DownwardProtocol<K2, V2> downlink = null;
  40.   private boolean isOk = true;
  41.   private boolean skipping = false;
  42.   public void configure(JobConf job) {
  43.     this.job = job;
  44.     //disable the auto increment of the counter. For pipes, no of processed 
  45.     //records could be different(equal or less) than the no of records input.
  46.     SkipBadRecords.setAutoIncrReducerProcCount(job, false);
  47.     skipping = job.getBoolean("mapred.skip.on", false);
  48.   }
  49.   /**
  50.    * Process all of the keys and values. Start up the application if we haven't
  51.    * started it yet.
  52.    */
  53.   public void reduce(K2 key, Iterator<V2> values, 
  54.                      OutputCollector<K3, V3> output, Reporter reporter
  55.                      ) throws IOException {
  56.     isOk = false;
  57.     startApplication(output, reporter);
  58.     downlink.reduceKey(key);
  59.     while (values.hasNext()) {
  60.       downlink.reduceValue(values.next());
  61.     }
  62.     if(skipping) {
  63.       //flush the streams on every record input if running in skip mode
  64.       //so that we don't buffer other records surrounding a bad record.
  65.       downlink.flush();
  66.     }
  67.     isOk = true;
  68.   }
  69.   @SuppressWarnings("unchecked")
  70.   private void startApplication(OutputCollector<K3, V3> output, Reporter reporter) throws IOException {
  71.     if (application == null) {
  72.       try {
  73.         LOG.info("starting application");
  74.         application = 
  75.           new Application<K2, V2, K3, V3>(
  76.               job, null, output, reporter, 
  77.               (Class<? extends K3>) job.getOutputKeyClass(), 
  78.               (Class<? extends V3>) job.getOutputValueClass());
  79.         downlink = application.getDownlink();
  80.       } catch (InterruptedException ie) {
  81.         throw new RuntimeException("interrupted", ie);
  82.       }
  83.       int reduce=0;
  84.       downlink.runReduce(reduce, Submitter.getIsJavaRecordWriter(job));
  85.     }
  86.   }
  87.   /**
  88.    * Handle the end of the input by closing down the application.
  89.    */
  90.   public void close() throws IOException {
  91.     // if we haven't started the application, we have nothing to do
  92.     if (isOk) {
  93.       OutputCollector<K3, V3> nullCollector = new OutputCollector<K3, V3>() {
  94.         public void collect(K3 key, 
  95.                             V3 value) throws IOException {
  96.           // NULL
  97.         }
  98.       };
  99.       startApplication(nullCollector, Reporter.NULL);
  100.     }
  101.     try {
  102.       if (isOk) {
  103.         application.getDownlink().endOfInput();
  104.       } else {
  105.         // send the abort to the application and let it clean up
  106.         application.getDownlink().abort();
  107.       }
  108.       LOG.info("waiting for finish");
  109.       application.waitForFinish();
  110.       LOG.info("got done");
  111.     } catch (Throwable t) {
  112.       application.abort(t);
  113.     } finally {
  114.       application.cleanup();
  115.     }
  116.   }
  117. }