分享

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


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




hadoop分为新旧api,由于hadoop目前最新版本2.4,本文是以hadoop2.4发布的api来进行分析的。

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

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

  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接口

config.jpg

  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接口:


configed.jpg

  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. }
复制代码
继承关系如下:
inherit.png
再看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.jpg


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

这里在强调一下:以下面函数为准
  /**
   * Runs the given <code>Tool</code> by {@link Tool#run(String[])}, after
   * parsing with the given generic arguments. Uses the given
   * <code>Configuration</code>, or builds one if null.
   *
   * Sets the <code>Tool</code>'s configuration with the possibly modified
   * version of the <code>conf</code>.  
   *
   * @param conf <code>Configuration</code> for the <code>Tool</code>.
   * @param tool <code>Tool</code> to run.
   * @param args command-line arguments to the tool.
   * @return exit code of the {@link Tool#run(String[])} method.
   */
  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是一个接口,ToolRunner是一个类,ToolRunner类里面的run函数,如下
public static int run(Configuration conf, Tool tool, String[] args)
    throws Exception{

.............................
    return tool.run(toolArgs);
}
这个函数把二者给结合起来了,也就是说我们ToolRunner的run方法本质是调用的tool的run方法。而run方法,则是BookCount类继承了tool,然后重写了
@Override
public int run(String[] args) throws Exception

这个run方法里,我们把job的各种设置由驱动主函数mian()移植到run方法中,然后驱动函数main()通过 ToolRunner.run(conf, new BookCount(), args);调用这个重写方法,代码可以参考下面






我们run重写run方法

  1. @Override
  2.         public int run(String[] args) throws Exception {
  3.                 try {
  4.                         //函数实现
  5.                 } catch (Exception e) {
  6.                         logger.error(e.getMessage());
  7.                         e.printStackTrace();
  8.                 }
  9.                 return 0;
  10.         }
复制代码

驱动主函数:

public class BookCount extends Configured implements Tool {

public static final Logger logger = Logger.getLogger(BookCount.class);

public static void main(String[] args) throws Exception {

PropertyConfigurator.configure("conf/log4j.properties");

logger.info("BookCountNew starting");

System.setProperty("HADOOP_USER_NAME", "hduser");

Configuration conf = new Configuration();

int res = ToolRunner.run(conf, new BookCount(), args);

logger.info("BookCountNew end");

System.exit(res);

}








加微信w3aboutyun,可拉入技术爱好者群

已有(1)人评论

跳转到指定楼层
271592448 发表于 2014-7-3 10:42:13
真心不错.楼主搞得很好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条