立即注册 登录
About云-梭伦科技 返回首页

nettman的个人空间 https://aboutyun.com/?21 [收藏] [复制] [分享] [RSS]

日志

hadoop2.4新api编程:Hadoop Tool,ToolRunner原理分析

热度 1已有 947 次阅读2014-7-2 12:05

问题导读:
1.Tool是接口还是类?
2.Tool继承了那个类?
3.Tool与ToolRunner的关系是什么?
4. Tool与ToolRunner作用分别是什么?






首先我们需要会查看源码,源码的查看,可以参考:如何通过eclipse查看、阅读hadoop2.4源码

我们首先查看接口Tool:
(Tool.java)
 

  1. @InterfaceAudience.Public
  2. @InterfaceStability.Stable
  3. public interface Tool extends Configurable {
  4.   /**
  5.    * Execute the command with the given arguments.
  6.    * 
  7.    * @param args command specific arguments.
  8.    * @return exit code.
  9.    * @throws Exception
  10.    */
  11.   int run(String [] args) throws Exception;
  12. }

Tool接口继承了Configurable接口,只有一个run()方法。(接口继承接口)

继续自Configurable接口

 

  1. public interface Configurable {

  2.   /** Set the configuration to be used by this object. */
  3.   void setConf(Configuration conf);

  4.   /** Return the configuration used by this object. */
  5.   Configuration getConf();
  6. }



Configurable接口只定义了两个方法:setConf与 getConf。

Configured类实现了Configurable接口:


 

  1. @InterfaceAudience.Public
  2. @InterfaceStability.Stable
  3. public class Configured implements Configurable {

  4.   private Configuration conf;

  5.   /** Construct a Configured. */
  6.   public Configured() {
  7.     this(null);
  8.   }
  9.   
  10.   /** Construct a Configured. */
  11.   public Configured(Configuration conf) {
  12.     setConf(conf);
  13.   }

  14.   // inherit javadoc
  15.   @Override
  16.   public void setConf(Configuration conf) {
  17.     this.conf = conf;
  18.   }

  19.   // inherit javadoc
  20.   @Override
  21.   public Configuration getConf() {
  22.     return conf;
  23.   }

  24. }

继承关系如下:
 
再看ToolRunner类的一部分:


下面两个是重载函数:
  1. public static int run(Configuration conf, Tool tool, String[] args) 
  2.     throws Exception{
  3.     if(conf == null) {
  4.       conf = new Configuration();
  5.     }
  6.     GenericOptionsParser parser = new GenericOptionsParser(conf, args);
  7.     //set the configuration back, so that Tool can configure itself
  8.     tool.setConf(conf);
  9.     
  10.     //get the args w/o generic hadoop args
  11.     String[] toolArgs = parser.getRemainingArgs();
  12.     return tool.run(toolArgs);
  13.   }




  1. /**
  2.    * Runs the <code>Tool</code> with its <code>Configuration</code>.
  3.    * 
  4.    * Equivalent to <code>run(tool.getConf(), tool, args)</code>.
  5.    * 
  6.    * @param tool <code>Tool</code> to run.
  7.    * @param args command-line arguments to the tool.
  8.    * @return exit code of the {@link Tool#run(String[])} method.
  9.    */
  10.   public static int run(Tool tool, String[] args) 
  11.     throws Exception{
  12.     return run(tool.getConf(), tool, args);
  13.   }

 


从上面两个ToolRunner的静态方法run()可以看到,处理hadoop的通用命令行参数,然后将args交给tool来处理,再由tool来运行自己的run方法。

这里在强调一下:以下面函数为准

  1.   /**
  2.    * Runs the given <code>Tool</code> by {@link Tool#run(String[])}, after 
  3.    * parsing with the given generic arguments. Uses the given 
  4.    * <code>Configuration</code>, or builds one if null.
  5.    * 
  6.    * Sets the <code>Tool</code>'s configuration with the possibly modified 
  7.    * version of the <code>conf</code>.  
  8.    * 
  9.    * @param conf <code>Configuration</code> for the <code>Tool</code>.
  10.    * @param tool <code>Tool</code> to run.
  11.    * @param args command-line arguments to the tool.
  12.    * @return exit code of the {@link Tool#run(String[])} method.
  13.    */
  14.   public static int run(Configuration conf, Tool tool, String[] args) 
  15.     throws Exception{
  16.     if(conf == null) {
  17.       conf = new Configuration();
  18.     }
  19.     GenericOptionsParser parser = new GenericOptionsParser(conf, args);
  20.     //set the configuration back, so that Tool can configure itself
  21.     tool.setConf(conf);
  22.     
  23.     //get the args w/o generic hadoop args
  24.     String[] toolArgs = parser.getRemainingArgs();
  25.     return tool.run(toolArgs);
  26.   }





Tool是一个接口,ToolRunner是一个类,在run()方法中,是作为参数传递的


  1. public static int run(Configuration conf, Tool tool, String[] args)

由于tool继续了Configurable,所以可以完成下面的事情:

  1. tool.setConf(conf);

  1. return tool.run(toolArgs);


这样Tool接口与ToolRunner类,他们之间的关系更明确了。

路过

雷人

握手

鲜花

鸡蛋

发表评论 评论 (1 个评论)

回复 x5136160 2014-7-10 18:12
了解了解。。。。看看看。。学习学习。

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条