Hadoop中的辅助类ToolRunner和Configured的用法详解

在开始学习hadoop时,最痛苦的一件事就是难以理解所写程序的执行过程,让我们先来看这个实例,这个测试类ToolRunnerTest继承Configured的基础上实现了Tool接口,下面对其用到的基类源码进行分析,就可以理解其执行过程是如此简单。。。。。。

 1 package xml;
 2 
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.conf.Configured;
 5 import org.apache.hadoop.util.Tool;
 6 import org.apache.hadoop.util.ToolRunner;
 7 
 8 public class ToolRunnerTest extends Configured implements Tool {
 9 
10     @Override
11     public int run(String[] arg0) throws Exception {
12         //调用基类Configured的getConf获取环境变量实例
13         Configuration conf=getConf();
14         //获取属性值
15         System.out.println("flower is " + conf.get("flower"));
16         System.out.println("color id "+ conf.get("color"));
17         System.out.println("blossom ? "+conf.get("blossom"));
18         System.out.println("this is the host default name ="+conf.get("fs.default.name"));    
19         return 0;
20     }
21 
22     /**
23      * @param args
24      * @throws Exception 
25      */
26     public static void main(String[] args) throws Exception {
27         // TODO Auto-generated method stub
28         //获取当前环境变量
29         Configuration conf=new Configuration();
30         //使用ToolRunner的run方法对自定义的类型进行处理
31         ToolRunner.run(conf, new ToolRunnerTest(), args);
32         
33     }
34 
35 }

基类Configured实现了Configurable接口,而Configurable接口源码如下

1 Public interface Configurable{
2     Void setConf(Configuration conf);
3     Configuration getConf();
4 }

Configured则必须实现Configurable类的两个方法,源码如下

 1 Public class Configured implements  Configurable{
 2 Private Configuration conf;
 3 Public Configured(Configuration conf){setConf(conf);}//构造方法
 4 Public void setConf(Configuration conf)
 5 {
 6 This.conf=conf;
 7 }
 8 Public getConf()
 9 {
10 Return conf;
11 }
12 }

Tool的源码如下所示:

public interface Tool extends Configurable {

int run(String [] args) throws Exception;

}

就这么一点点

ToolRunner类的源码如下

 1 public class ToolRunner {
 2 public static int run(Configuration conf, Tool tool, String[] args) 
 3     throws Exception{
 4     if(conf == null) {
 5       conf = new Configuration();
 6     }
 7     GenericOptionsParser parser = new GenericOptionsParser(conf, args);
 8     //set the configuration back, so that Tool can configure itself
 9     tool.setConf(conf)
10     String[] toolArgs = parser.getRemainingArgs();
11     return tool.run(toolArgs);
12   }
13    public static int run(Tool tool, String[] args) 
14     throws Exception{
15     return run(tool.getConf(), tool, args);
16   }
17   
18   public static void printGenericCommandUsage(PrintStream out) {
19     GenericOptionsParser.printGenericCommandUsage(out);
20   }
21   
22 }

解析:当程序执行ToolRunner.run(conf, new ToolRunnerTest(), args);时,会转到ToolRunner类的run方法部分,因为Configuration已经实例,所以直至执行到tool.run(toolArgs);又因为Tool是一个只含有一个run方法框架的接口,所以将执行实现这个接口的类ToolRunnerTestrun方法。完成其输出。其实在看完这几个类的源码后,其执行过程是很简单的

该实例的运行结果如下:

 

posted @ 2014-10-01 20:54  幽林孤狼  阅读(6132)  评论(1编辑  收藏  举报