• 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方法。完成其输出。其实在看完这几个类的源码后,其执行过程是很简单的

    该实例的运行结果如下:

     

  • 相关阅读:
    Hyper-V中的VM如何使用Pass-through Disk
    LDF文件丢失, 如何仅用MDF文件恢复数据库呢?
    PowerShell中的一个switch的例子
    NetBiosDomainNamesEnabled与SharePoint User Profile Service Application
    在Windows Server 2008 R2上安装Exchange 2013过程中遇到的一些问题
    C语言位域精解(转)
    uniq命令 (转)
    sort命令
    curl命令(测试连接命令)
    C10K——千万级并发实现的秘密:内核不是解决方案,而是问题所在!(转)
  • 原文地址:https://www.cnblogs.com/ylgl/p/4003560.html
Copyright © 2020-2023  润新知