001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package org.apache.hadoop.util;
020    
021    import org.apache.hadoop.classification.InterfaceAudience;
022    import org.apache.hadoop.classification.InterfaceStability;
023    import org.apache.hadoop.conf.Configurable;
024    
025    /**
026     * A tool interface that supports handling of generic command-line options.
027     * 
028     * <p><code>Tool</code>, is the standard for any Map-Reduce tool/application. 
029     * The tool/application should delegate the handling of 
030     * <a href="{@docRoot}/org/apache/hadoop/util/GenericOptionsParser.html#GenericOptions">
031     * standard command-line options</a> to {@link ToolRunner#run(Tool, String[])} 
032     * and only handle its custom arguments.</p>
033     * 
034     * <p>Here is how a typical <code>Tool</code> is implemented:</p>
035     * <p><blockquote><pre>
036     *     public class MyApp extends Configured implements Tool {
037     *     
038     *       public int run(String[] args) throws Exception {
039     *         // <code>Configuration</code> processed by <code>ToolRunner</code>
040     *         Configuration conf = getConf();
041     *         
042     *         // Create a JobConf using the processed <code>conf</code>
043     *         JobConf job = new JobConf(conf, MyApp.class);
044     *         
045     *         // Process custom command-line options
046     *         Path in = new Path(args[1]);
047     *         Path out = new Path(args[2]);
048     *         
049     *         // Specify various job-specific parameters     
050     *         job.setJobName("my-app");
051     *         job.setInputPath(in);
052     *         job.setOutputPath(out);
053     *         job.setMapperClass(MyMapper.class);
054     *         job.setReducerClass(MyReducer.class);
055     *
056     *         // Submit the job, then poll for progress until the job is complete
057     *         JobClient.runJob(job);
058     *         return 0;
059     *       }
060     *       
061     *       public static void main(String[] args) throws Exception {
062     *         // Let <code>ToolRunner</code> handle generic command-line options 
063     *         int res = ToolRunner.run(new Configuration(), new MyApp(), args);
064     *         
065     *         System.exit(res);
066     *       }
067     *     }
068     * </pre></blockquote></p>
069     * 
070     * @see GenericOptionsParser
071     * @see ToolRunner
072     */
073    @InterfaceAudience.Public
074    @InterfaceStability.Stable
075    public interface Tool extends Configurable {
076      /**
077       * Execute the command with the given arguments.
078       * 
079       * @param args command specific arguments.
080       * @return exit code.
081       * @throws Exception
082       */
083      int run(String [] args) throws Exception;
084    }