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

引文

学习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:核心思想与源码分析》一书现在已经正式出版上市,目前京东、当当、天猫等网站均有销售,欢迎感兴趣的同学购买。

京东:http://item.jd.com/11846120.html
当当:http://product.dangdang.com/23838168.html

时间: 2024-10-14 14:50:31

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

记Hadoop2.5.0线上mapreduce任务执行map任务划分的一次问题解决

前言 近日在线上发现有些mapreduce作业的执行时间很长,我们需要解决这个问题.输入文件的大小是5G,采用了lzo压缩,整个集群的默认block大小是128M.本文将详细描述这次线上问题的排查过程. 现象 线上有一个脚本,为了便于展示,我将这个脚本重新copy了一份并重命名为zzz.这个脚本实际是使用Hadoop streaming运行一个mapreduce任务,在线上执行它的部分输出内容如下: 可以看到map任务划分为1个.这个执行过程十分漫长,我将中间的一些信息省略,map与reduce

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

1 #!/usr/bin/env bash    此处为什么不是  #!/bin/bash  ? 考虑到程序的可移植性,env的作用就是为了找到正确的脚本解释器(这里就是bash),在不同的Linux系统上该解释器可能所处的位置不同 18 # This script runs the hadoop core commands. 19 20 bin=`which $0`                                  shell的默认赋值是字符串赋值, $0表示脚本本身的名字,w

【甘道夫】Ubuntu14 server + Hadoop2.2.0环境下Sqoop1.99.3部署记录

第一步.下载.解压.配置环境变量: 官网下载sqoop1.99.3 http://mirrors.cnnic.cn/apache/sqoop/1.99.3/ 将sqoop解压到目标文件夹,我的是 /home/fulong/Sqoop/sqoop-1.99.3-bin-hadoop200 配置环境变量: export SQOOP_HOME=/home/fulong/Sqoop/sqoop-1.99.3-bin-hadoop200 export PATH=$PATH:$SQOOP_HOME/bin

sqoop1.4.6+hadoop2.6.0 转载

转载地址:http://blog.csdn.net/zhangzhaokun/article/details/44313531 (1)安装环境         操作系统:Linux(centos6.5)         JDK版本:1.7.0_45         Hadoop版本:hadoop2.2.0         Sqoop版本:sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar.gz         hadoop安装目录:/home/hadoop/hadoo

hadoop2.6.0实践:引入开发依赖的jar包

hadoop-2.5.0\share\hadoop\common  所有jar,hadoop-2.5.0\share\hadoop\common\lib  所有jar, hadoop-2.5.0\share\hadoop\hdfs  所有jar hadoop-2.5.0\share\hadoop\mapreduce  所有jar hadoop-2.5.0\share\hadoop\yarn  所有jar

hadoop2.7.0实践- WordCount

环境要求 说明:本文档为wordcount的mapreduce job编写及运行文档. 操作系统:Ubuntu14 x64位 Hadoop:Hadoop 2.7.0 Hadoop官网:http://hadoop.apache.org/releases.html MapReduce参照官网步骤: http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTu

Hadoop2.6.0 + Spark1.4.0 在Ubuntu14.10环境下的伪分布式集群的搭建(实践可用)

前言,之前曾多次搭建集群,由于疏于记录,每次搭建的时候到处翻阅博客,很是费劲,在此特别记录集群的搭建过程. 0.环境:Ubuntu14.10.Hadoop2.6.0.spark-1.4.0 1.安装jdk1.7 (1)下载jdk-7u25-linux-i586.tar.gz: (2)解压jdk-7u25-linux-i586.tar.gz,并将其移动到 /opt/java/jdk/路径下面 (3)配置java环境变量: 在 /etc/profile文件中追加 #set java env expo

基于Hadoop2.5.0的集群搭建

http://download.csdn.net/download/yameing/8011891 一. 规划 1.  准备安装包 JDK:http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz Hadoop:http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.5.0/hadoop-2.5.0.tar.gz Hive:http://apac

Hadoop2.3.0详细安装过程

前言:       Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上:而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序.HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据. Hadoop的框架最核心的