日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/3/18 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引文

學(xué)習(xí)Hadoop的同學(xué)們,一定知道如果運(yùn)行Hadoop自帶的各種例子,以大名鼎鼎的wordcount為例,你會(huì)輸入以下命令:

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

當(dāng)然,有些人還會(huì)用以下替代方式:

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

相比于原始的執(zhí)行方式,使用jar命令方式,讓我們不用再敲入繁瑣的完整包路徑。比如我們知道hadoop-mapreduce-examples項(xiàng)目中還提供了其它的例子,比如計(jì)算圓周率的例子,我們只需要記住此應(yīng)用的簡(jiǎn)單名字pi,就可以執(zhí)行它:

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

雖說(shuō)我們只是使用這些現(xiàn)成的例子,沒(méi)有必要較真,但是這種簡(jiǎn)潔的使用方式,無(wú)疑還是值得借鑒的。本文將分析下這種方式實(shí)現(xiàn)的原理,有興趣的同學(xué)可以一讀。

源碼分析

這一節(jié),我們通過(guò)對(duì)hadoop-mapreduce-examples項(xiàng)目中的關(guān)鍵源碼進(jìn)行分析,理解簡(jiǎn)潔執(zhí)行的原理。在hadoop-mapreduce-examples項(xiàng)目的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命令執(zhí)行hadoop-mapreduce-examples-2.6.0.jar包時(shí),實(shí)際執(zhí)行了ExampleDriver的main方法,ExampleDriver的實(shí)現(xiàn)如下:

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.");// 省略其它例子的注冊(cè)代碼pgd.addClass("pi", QuasiMonteCarlo.class, QuasiMonteCarlo.DESCRIPTION);// 省略其它例子的注冊(cè)代碼exitCode = pgd.run(argv);}catch(Throwable e){e.printStackTrace();}System.exit(exitCode);} }

以上代碼構(gòu)造了ProgramDriver的實(shí)例,并且調(diào)用其addClass方法,三個(gè)參數(shù)分別是例子名稱(如wordcount、pi等)、例子的實(shí)現(xiàn)Class、例子的描述信息。ProgramDriver的addClass方法的實(shí)現(xiàn)如下:

public void addClass(String name, Class<?> mainClass, String description)throws Throwable {programs.put(name , new ProgramDescription(mainClass, description));}

首先,構(gòu)造ProgramDescription對(duì)象,其構(gòu)造函數(shù)如下:

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實(shí)例注冊(cè)到programs中,programs的類型定義如下:

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

ExampleDriver的main方法在最后會(huì)調(diào)用ProgramDriver的run方法,其實(shí)現(xiàn)如下:

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 mainString[] 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方法執(zhí)行的步驟如下:

  • 參數(shù)長(zhǎng)度校驗(yàn);
  • 根據(jù)第一個(gè)參數(shù),從programs中查找對(duì)應(yīng)的ProgramDescription實(shí)例;
  • 將其余的參數(shù)傳遞給ProgramDescription的invoke方法,進(jìn)而執(zhí)行對(duì)應(yīng)的例子。
    ProgramDescription的invoke方法的實(shí)現(xiàn)如下:
  • public void invoke(String[] args)throws Throwable {try {main.invoke(null, new Object[]{args});} catch (InvocationTargetException except) {throw except.getCause();}}

    由此我們知道具體例子的執(zhí)行,是通過(guò)反射調(diào)用具體例子Class的main方法,最終實(shí)現(xiàn)的。

    后記:個(gè)人總結(jié)整理的《深入理解Spark:核心思想與源碼分析》一書現(xiàn)在已經(jīng)正式出版上市,目前京東、當(dāng)當(dāng)、天貓等網(wǎng)站均有銷售,歡迎感興趣的同學(xué)購(gòu)買。

    京東(現(xiàn)有滿150減50活動(dòng))):http://item.jd.com/11846120.html
    當(dāng)當(dāng):http://product.dangdang.com/23838168.html

    總結(jié)

    以上是生活随笔為你收集整理的Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。