引文

学习Hadoop的同学们,一定知道假设执行Hadoop自带的各种样例,以大名鼎鼎的wordcount为例,你会输入下面命令:

hadoop org.apache.hadoop.examples.WordCount -D mapreduce.input.fileinputformat.split.maxsize=1 /wordcount/input /wordcount/output/result1

当然。有些人还会用下面替代方式:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /wordcount/input /wordcount/output/result1

相比于原始的运行方式,使用jar命令方式。让我们不用再敲入繁琐的完整包路径。比方我们知道hadoop-mapreduce-examples项目中还提供了其他的样例,比方计算圆周率的样例,我们仅仅须要记住此应用的简单名字pi,就能够运行它:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 5 10

虽说我们仅仅是使用这些现成的样例,没有必要较真,可是这样的简洁的使用方式,无疑还是值得借鉴的。本文将分析下这样的方式实现的原理,有兴趣的同学能够一读。

源代码分析

这一节,我们通过对hadoop-mapreduce-examples项目中的关键源代码进行分析。理解简洁运行的原理。在hadoop-mapreduce-examples项目的pom.xml文件里配置了org.apache.hadoop.examples.ExampleDriver作为jar命令的入口。配置例如以下:

   <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>org.apache.hadoop.examples.ExampleDriver</mainClass>
</manifest>
</archive>
</configuration>
</plugin>

这决定了使用jar命令运行hadoop-mapreduce-examples-2.6.0.jar包时。实际运行了ExampleDriver的main方法,ExampleDriver的实现例如以下:

public class ExampleDriver {

  public static void main(String argv[]){
int exitCode = -1;
ProgramDriver pgd = new ProgramDriver();
try {
pgd.addClass("wordcount", WordCount.class,
"A map/reduce program that counts the words in the input files.");
// 省略其他样例的注冊代码
pgd.addClass("pi", QuasiMonteCarlo.class, QuasiMonteCarlo.DESCRIPTION);
// 省略其他样例的注冊代码
exitCode = pgd.run(argv);
}
catch(Throwable e){
e.printStackTrace();
} System.exit(exitCode);
}
}

以上代码构造了ProgramDriver的实例。而且调用其addClass方法,三个參数各自是样例名称(如wordcount、pi等)、样例的实现Class、样例的描写叙述信息。ProgramDriver的addClass方法的实现例如以下:

  public void addClass(String name, Class<?

> mainClass, String description)
throws Throwable {
programs.put(name , new ProgramDescription(mainClass, description));
}

首先,构造ProgramDescription对象。其构造函数例如以下:

    public ProgramDescription(Class<?> mainClass,
String description)
throws SecurityException, NoSuchMethodException {
this.main = mainClass.getMethod("main", paramTypes);
this.description = description;
}

当中main的类型是java.lang.reflect.Method。用于保存样例Class的main方法。

然后。将样例名称(如wordcount、pi等)和ProgramDescription实例注冊到programs中。programs的类型定义例如以下:

  /**
* A description of a program based on its class and a
* human-readable description.
*/
Map<String, ProgramDescription> programs;

ExampleDriver的main方法在最后会调用ProgramDriver的run方法。事实上现例如以下:

  public int run(String[] args)
throws Throwable
{
// Make sure they gave us a program name.
if (args.length == 0) {
System.out.println("An example program must be given as the" +
" first argument.");
printUsage(programs);
return -1;
} // And that it is good.
ProgramDescription pgm = programs.get(args[0]);
if (pgm == null) {
System.out.println("Unknown program '" + args[0] + "' chosen.");
printUsage(programs);
return -1;
} // Remove the leading argument and call main
String[] new_args = new String[args.length - 1];
for(int i=1; i < args.length; ++i) {
new_args[i-1] = args[i];
}
pgm.invoke(new_args);
return 0;
}

ProgramDriver的run方法运行的过程例如以下:

  1. 參数长度校验;
  2. 依据第一个參数,从programs中查找相应的ProgramDescription实例。
  3. 将其余的參数传递给ProgramDescription的invoke方法。进而运行相应的样例。

ProgramDescription的invoke方法的实现例如以下:
    public void invoke(String[] args)
throws Throwable {
try {
main.invoke(null, new Object[]{args});
} catch (InvocationTargetException except) {
throw except.getCause();
}
}

由此我们知道详细样例的运行,是通过反射调用详细样例Class的main方法,终于实现的。


后记:个人总结整理的《深入理解Spark:核心思想与源代码分析》一书如今已经正式出版上市。眼下京东、当当、天猫等站点均有销售。欢迎感兴趣的同学购买。

京东(现有满150减50活动)):http://item.jd.com/11846120.html

当当:http://product.dangdang.com/23838168.html

Hadoop2.6.0子项目hadoop-mapreduce-examples的简介的更多相关文章

  1. Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍

    引文 学习Hadoop的同学们,一定知道如果运行Hadoop自带的各种例子,以大名鼎鼎的wordcount为例,你会输入以下命令: hadoop org.apache.hadoop.examples. ...

  2. Hadoop-2.2.0中国文献——MapReduce 下一代 —配置单节点集群

    Mapreduce 包 你需从公布页面获得MapReduce tar包.若不能.你要将源代码打成tar包. $ mvn clean install -DskipTests $ cd hadoop-ma ...

  3. Hadoop-2.2.0中国文献—— MapReduce 下一代 -- 公平调度

    目的 此文档描写叙述了 FairScheduler, Hadoop 的一个可插入式的调度器.同意 YARN 应用在一个大集群中公平地共享资源. 简单介绍 公平调度是一种分配资源给应用的方法,以致到最后 ...

  4. 理解Hadoop脚本hadoop-2.5.0/bin/hadoop

    1 #!/usr/bin/env bash    此处为什么不是  #!/bin/bash  ? 考虑到程序的可移植性,env的作用就是为了找到正确的脚本解释器(这里就是bash),在不同的Linux ...

  5. hadoop-2.6.0.tar.gz + spark-1.5.2-bin-hadoop2.6.tgz的集群搭建(单节点)

    前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接.http://www.cnblogs.com/zlslch/p/ ...

  6. hadoop-2.6.0.tar.gz + spark-1.5.2-bin-hadoop2.6.tgz 的集群搭建(3节点和5节点皆适用)

    本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接.http://www.cnblogs.com/zlslch/p/584 ...

  7. hadoop-2.6.0.tar.gz + spark-1.5.2-bin-hadoop2.6.tgz的集群搭建(单节点)(Ubuntu系统)

    前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接.http://www.cnblogs.com/zlslch/p/ ...

  8. sqoop1.4.6+hadoop2.6.0 转载

    转载地址:http://blog.csdn.net/zhangzhaokun/article/details/44313531 (1)安装环境         操作系统:Linux(centos6.5 ...

  9. Hadoop2.2.0环境下Sqoop1.99.3安装

    本文转载自http://blog.csdn.net/liuwenbo0920/article/details/40504045 1.安装准备工作: 已经装好的hadoop环境是hadoop 2.2.0 ...

随机推荐

  1. 陕西师范大学第七届程序设计竞赛网络同步赛 I 排队排队排队【数组任一位可以移动到队头,最少移动几次增序/数组指针操作】

    链接:https://www.nowcoder.com/acm/contest/121/I来源:牛客网 题目描述 ACM竞赛队内要开运动会啦!!!! 竞赛队内的一群阳光乐观积极的队员们迅速的在操场上站 ...

  2. Codeforces Round #191 (Div. 2) A. Flipping Game【*枚举/DP/每次操作可将区间[i,j](1=<i<=j<=n)内牌的状态翻转(即0变1,1变0),求一次翻转操作后,1的个数尽量多】

    A. Flipping Game     time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. quailty's Contest #1 道路修建 EXT(启发式合并)

    题目链接  道路修建 EXT 考虑并查集的启发式合并,合并的时候小的子树的根成为大的子树的根的儿子. 可以证明这样整棵树的深度不会超过$logn$. 两个根合并的时候,产生的新的边的边权为当前的时间. ...

  4. 线段树【p2629】 好消息,坏消息

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p2629 好消息,坏消息 历程 刚开始看到这个题,发现是需要维护区间和,满心欢喜敲了一通线段树,简单debug之后交上去 \ ...

  5. 数据库系统入门 | Not Exisits 结构的灵活应用

    教材 /<数据库系统概念>第六版第三章内容 机械工程出版社:实验软件/Qracle 11g 写在前面 用下面的样例1引出我们讨论的这一类方法. 样例1:使用大学模式,用SQL写出以下查询, ...

  6. C语言的运算符、位操作

    + - * / (加 减 乘 除) > >= < <= (大于 大于等于 小于 小于等于) == != (测试等于 测试不等于) && || ! (逻辑与 逻辑 ...

  7. Winform打砖块游戏制作step by step第二节---.画挡板

    一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 预备知识,无GDI画图基础的童鞋请先阅读一篇文章让你彻底弄懂WinFor ...

  8. JAVA常见算法题(八)

    package com.xiaowu.demo; /** * 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加), ...

  9. android下socket编程问题:服务器关闭时,客户端发送请求的异常处理

    我用socket分别创建了一个服务器和一个客户端. 当服务器程序运行时,客户端和服务器发送接收数据是OK的. 但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException.但 ...

  10. 机器学习算法实践:决策树 (Decision Tree)(转载)

    前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...