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方法框架的接口,所以将执行实现这个接口的类ToolRunnerTest的run方法。完成其输出。其实在看完这几个类的源码后,其执行过程是很简单的

该实例的运行结果如下:

时间: 2024-10-10 08:20:45

Hadoop中的辅助类ToolRunner和Configured的用法详解的相关文章

JavaScript中bind、call、apply函数用法详解

在给我们项目组的其他程序介绍 js 的时候,我准备了很多的内容,但看起来效果不大,果然光讲还是不行的,必须动手.前几天有人问我关于代码里 call() 函数的用法,我让他去看书,这里推荐用js 写服务器的程序猿看<javascript编程精粹> 这本书,crockford大神果然不是盖的.之后我在segmentfault上又看到了类似的问题,那边解答之后干脆这里记一笔. 首先,关于 js 定义类或对象的方法,请参看w3school 的这里的这里,写的非常详细和清晰,我不再赘言了. 为了介绍 b

Css中路径data:image/png;base64的用法详解 (转载)

大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: background-image:url(data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXR FWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJRE FUeNo8zjsOxCAMBFB/KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIB hH5E

Css中路径data:image/png;base64的用法详解

今天查看一些网站的css中发现了 background-image:url(data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXR FWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJRE FUeNo8zjsOxCAMBFB/KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIB hH5EAB8b+Tlt9MYQ6i1BuqFaq1CKSVcxZ

ES6中的promise、async、await用法详解

<!DOCTYPE html> <html> <head> <title>Promise.async.await</title> </head> <body> <script type="text/javascript"> //promise用法(返回异步方法返回的数据,resolve获取数据成功后调用的方法, reject获取数据失败后调用的方法) //第一种写法 var p = new

mysql中explain输出列之id的用法详解

参考mysql5.7 en manual,对列id的解释: The SELECT identifier. This is the sequential number of the SELECT within the query. The value can be NULL if the row refers to the union result of other rows. In this case, the table column shows a value like <unionM,N>

PHP中的ob_start用法详解

用PHP的ob_start();控制您的浏览器cache Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用.我们先举一个简单的例子,让大家对Output Control有一个大致的印象:Example 1. 程序代码 程序代码<?phpob_start(

CSS中伪类及伪元素用法详解

原文:CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的读者可以自己尝试: :active  大致效果为用鼠标点击时,元素增加特效,鼠标松开时,特效消失.多用在按钮的点击上. 写法: 这里id为box的是一div块,在css中首先设置了他的基本样式,下面为加入:active伪类后需要修改的样式. 未点击时: 点击之后: :active.:hover.:

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

oracle中的exists 和not exists 用法详解

oracle中的exists 和not exists 用法详解 有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高. 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>