    001/*
    002 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
    003 *
    004 * Project and contact information: http://www.cascading.org/
    005 *
    006 * This file is part of the Cascading project.
    007 *
    008 * Licensed under the Apache License, Version 2.0 (the "License");
    009 * you may not use this file except in compliance with the License.
    010 * You may obtain a copy of the License at
    011 *
    012 *     http://www.apache.org/licenses/LICENSE-2.0
    013 *
    014 * Unless required by applicable law or agreed to in writing, software
    015 * distributed under the License is distributed on an "AS IS" BASIS,
    016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017 * See the License for the specific language governing permissions and
    018 * limitations under the License.
    019 */
    020
    021package cascading.tap.hadoop.util;
    022
    023import java.io.IOException;
    024
    025import cascading.flow.FlowProcess;
    026import org.apache.hadoop.mapred.RecordReader;
    027
    028/**
    029 *
    030 */
    031public class MeasuredRecordReader implements RecordReader
    032  {
    033  private final FlowProcess flowProcess;
    034  private final Enum counter;
    035
    036  private RecordReader recordReader;
    037
    038  public MeasuredRecordReader( FlowProcess flowProcess, Enum counter )
    039    {
    040    this.flowProcess = flowProcess;
    041    this.counter = counter;
    042    }
    043
    044  public RecordReader getRecordReader()
    045    {
    046    return recordReader;
    047    }
    048
    049  public void setRecordReader( RecordReader recordReader )
    050    {
    051    this.recordReader = recordReader;
    052    }
    053
    054  @Override
    055  public boolean next( Object key, Object value ) throws IOException
    056    {
    057    long start = System.currentTimeMillis();
    058
    059    try
    060      {
    061      return recordReader.next( key, value );
    062      }
    063    finally
    064      {
    065      flowProcess.increment( counter, System.currentTimeMillis() - start );
    066      }
    067    }
    068
    069  @Override
    070  public Object createKey()
    071    {
    072    long start = System.currentTimeMillis();
    073
    074    try
    075      {
    076      return recordReader.createKey();
    077      }
    078    finally
    079      {
    080      flowProcess.increment( counter, System.currentTimeMillis() - start );
    081      }
    082    }
    083
    084  @Override
    085  public Object createValue()
    086    {
    087    long start = System.currentTimeMillis();
    088
    089    try
    090      {
    091      return recordReader.createValue();
    092      }
    093    finally
    094      {
    095      flowProcess.increment( counter, System.currentTimeMillis() - start );
    096      }
    097    }
    098
    099  @Override
    100  public long getPos() throws IOException
    101    {
    102    return recordReader.getPos();
    103    }
    104
    105  @Override
    106  public void close() throws IOException
    107    {
    108    long start = System.currentTimeMillis();
    109
    110    try
    111      {
    112      recordReader.close();
    113      }
    114    finally
    115      {
    116      flowProcess.increment( counter, System.currentTimeMillis() - start );
    117      }
    118    }
    119
    120  @Override
    121  public float getProgress() throws IOException
    122    {
    123    long start = System.currentTimeMillis();
    124
    125    try
    126      {
    127      return recordReader.getProgress();
    128      }
    129    finally
    130      {
    131      flowProcess.increment( counter, System.currentTimeMillis() - start );
    132      }
    133    }
    134  }