Hadoop Tool基础

Tool的入口

一个hadoop tool的基本实现

 public class MyApp extends Configured implements Tool {
       
         public int run(String[] args) throws Exception {
           // Configuration processed by ToolRunner
           Configuration conf = getConf();
           
           // Create a JobConf using the processed conf
           JobConf job = new JobConf(conf, MyApp.class);
           
           // Process custom command-line options
           Path in = new Path(args[1]);
           Path out = new Path(args[2]);
           
           // Specify various job-specific parameters     
           job.setJobName("my-app");
           job.setInputPath(in);
           job.setOutputPath(out);
           job.setMapperClass(MyMapper.class);
           job.setReducerClass(MyReducer.class);
  
           // Submit the job, then poll for progress until the job is complete
           JobClient.runJob(job);
           return 0;
         }
         
         public static void main(String[] args) throws Exception {
           // Let ToolRunner handle generic command-line options 
           int res = ToolRunner.run(new Configuration(), new MyApp(), args);
           
           System.exit(res);
         }
       }

其中

//这个是一个tool的第一个入口,main函数,通过ToolRunner运行。
public static void main(String[] args)throws Exception{
    int res = ToolRunner.run(Configuration conf, Tool tool, String[] args);
    System.exit(res);
}
//之后会运行tool的这个方法,tool会在这个run方法中完成功能逻辑,这个方法在org.apache.hadoop.util.Tool接口中
public int run(String[] args) throws Exception{
    //tool的主要功能实现
}

ToolRunner的主要功能

  • 创建(如果传入的是null),设置当前tool的Configuration
  • 处理命令行参数。

处理命令行参数

在tool的执行过程中,有两个地方可以读入命令行参数main中的args和run中的args。main函数中的args得到的是原始的明亮行参数,例如下面的args。

Usage: hadoop jar  [mainClass] args...

通常我们会传入一些跟hadoop运行时有关的参数,这中参数和某个tool的业务逻辑没啥关系,这是一般会通过-D key=val的方式传入,例如

Usage: hadoop jar  [mainClass] -D key=value... toolargs...

ToolRunner解析参数的作用是将这些参数提取并存入Configuration中,便于job提取,同时将剩余的toolargs传入run方法中。所以run方法得到的就是tool相关的args。

其中ToolRunner中的run方法实现如下(hadoop-common-2.4.0.jar)

  public static int run(Configuration conf, Tool tool, String[] args) 
    throws Exception{
    if(conf == null) {
      conf = new Configuration();
    }
    GenericOptionsParser parser = new GenericOptionsParser(conf, args);
    //set the configuration back, so that Tool can configure itself
    tool.setConf(conf);
    
    //get the args w/o generic hadoop args
    String[] toolArgs = parser.getRemainingArgs();
    return tool.run(toolArgs);
  }

在解析参数时,和tool相关的参数一定要写到最后,否则-D的参数不会被解析。

你可能感兴趣的:(Hadoop Tool基础)