1. 程式人生 > >Hadoop2.6.0子專案hadoop-mapreduce-examples的簡單介紹

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方法,最終實現的。

相關推薦

Hadoop2.6.0子專案hadoop-mapreduce-examples簡單介紹

引文 學習Hadoop的同學們,一定知道如果執行Hadoop自帶的各種例子,以大名鼎鼎的wordcount為例,你會輸入以下命令: hadoop org.apache.hadoop.examples.WordCount -D mapreduce.input.fileinp

Hadoop安裝教程_單機/偽分散式配置_CentOS6.4/Hadoop2.6.0

 2015-12-17 (updated: 2017-03-02) 本教程適合於在 CentOS 6.x 系統中安裝原生 Hadoop 2,適用於Hadoop 2.7.1, Hadoop 2.6.0 等版本,主要參考了官方安裝教程,步驟詳細,輔以適當說明,相信按照步驟來,都

Hadoop學習筆記———《Mac OS X 下hadoop2.6.0安裝教程》

1、安裝jdk 2、ssh免密碼登陸 2.1、在終端命令列下輸入: $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 其中''裡的是登陸的密碼,因為

編譯hadoop2.6.0 cdh 5.4.5 集成snappy壓縮

編譯 lib maven倉庫 cloudera pan url 下載源碼 cloud test 原文地址:http://www.cnblogs.com/qiaoyihang/p/6995146.html 1、下載源碼:http://archive-primary.cloud

Hadoop2.6.0版本號MapReudce演示樣例之WordCount(一)

set pat -m 代碼 分享 ont extends gravity csdn 一、準備測試數據 1、在本地Linux系統/var/lib/hadoop-hdfs/file/路徑下準備兩個文件file1.txt和file2.tx



《從0到1學習Flink》—— Mac 上搭建 Flink 1.6.0 環境並構建執行簡單程式入門

準備工作 1、安裝檢視 Java 的版本號,推薦使用 Java 8。 安裝 Flink 2、在 Mac OS X 上安裝 Flink 是非常方便的。推薦通過 homebrew 來安裝。 brew install apache-flink 複製程式碼 3、檢查安裝: flink --

hadoop2.6.0原始碼剖析-客戶端(第二部分--讀(open)HDFS檔案)

在讀HDFS檔案前,需要先open該檔案,這個呼叫的是org.apache.hadoop.fs.FileSystem類物件,但是由於實際建立的物件是org.apache.hadoop.hdfs.DistributedFileSystem類物件,後者是前者的子類,所以呼叫父類中的FSDataInput

hadoop2.6.0原始碼剖析-客戶端(第二部分--DFSClient)下(HA代理)

我們繼續進入到org.apache.hadoop.hdfs.NameNodeProxies的函式 public static <T> ProxyAndInfo<T> createProxy(Configuration conf,URI nameNodeUri, Class

hadoop2.6.0原始碼剖析-客戶端(第二部分--DFSClient)上(非HA代理)

我們講解完了DistributedFileSystem,隨著程式碼我們來到了DFSClient建構函式中,該函式程式碼如下: /**     * Create a new DFSClient connected to the given nameNodeUri or

hadoop2.6.0原始碼剖析-客戶端(第二部分--DistributedFileSystem)

DistributedFileSystem這個類在包package org.apache.hadoop.hdfs中,為使用者開發基於HDFS的應用程式提供了API,這個類有幾個成員變數: private Path workingDir; private URI uri; private Stri

hadoop2.6.0原始碼剖析-客戶端(第二部分--Configuration)

我們來講講Configuration類,從名字可以看出,這個類跟配置檔案有關,它的繼承關係如下: 這個類比較大,我們先從一個點切入,後面有需要會追加其他部分,我們的切入點是getDefaultUri函式,但如下: public static URI getDefaultUri(Conf

centos6.5安裝單機版hadoop2.6.0

安裝hadoop之前,首先要安裝 jdk1.8.0_181(我使用的版本) 並配置jdk環境變數,接下來開始安裝hadoop 1. hadoop2.6.0下載 下載地址:http://archive.apache.org/dist/hadoop/core/hadoop-2.6.0/

CDH版hadoop2.6.0-cdh5.7.0原始碼編譯

前置要求 hadoop2.6.0-cdh5.7.0 原始碼包 下載 jdk 1.7+ 下載 maven 3.0+ 下載 protobuf 2.5+ 下載 安裝依賴庫 $>yum install -y svn ncurses-devel gcc

hadoop-mapreduce-examples Hadoop例項

[[email protected] hadoop-3.1.1]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar An example program must be given as the f

hadoop2.6.0原始碼剖析-客戶端(第二部分--讀(read)HDFS檔案)

上篇文章我們分析了open函式,這個函式會獲取要開啟檔案的塊資訊,接下來我們開始分析讀檔案部分的程式碼。 我們先來看一個示例,程式碼如下: package com.hadoop.senior.hdfs; import java.io.File; import java.io.FileIn

Hadoop2.6.0開發遇到的所有問題及解決方案

一、如果配置了HDFS的federation,使用eclipse外掛配置完M/R Master的埠(50020)和DFS Master的埠(9000)後,無法連線到HDFS看遠端目錄結構 解決辦法:切換到Advanced parameters標籤,修改fs.defaultF

《從0到1學習Flink》—— Mac 上搭建 Flink 1.6.0 環境並構建執行簡單程式入門

準備工作 1、安裝檢視 Java 的版本號,推薦使用 Java 8。 安裝 Flink 2、在 Mac OS X 上安裝 Flink 是非常方便的。推薦通過 homebrew 來安裝。 brew install apache-flink 3、檢查安裝: f

spark2.4 整合 hadoop2.6.0-cdh5.7.0 原始碼編譯

1.前置要求 java 8 + maven 3.5.4 + scala 2.11 2.下載 spark2.4 原始碼包 在spark官網 下載頁面中選擇對應的spark版本和原始碼包 [[email protected] softwore

spark2.2.0-hadoop2.6.0預編譯叢集安裝

1、下載解壓 將下載好的spark-2.2.0-bin-hadoop2.6.tgz包移動到netcloud03 netcloud04 netcloud05 各節點的/opt目錄下並解壓 2、Spark基於Standalone執行模式進行配置  1)測試    cd

Hadoop2.6.0在CentOS 7中的叢集搭建

我這邊給出我的叢集環境是由一臺主節點master和三臺從節點slave組成: master     192.168.1.2 slave1       192.168.1.3 slave2       192.168.1.4 slave3       192.168.1.5 申明:我搭建的這個叢集不是