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
當然,有些人還會用以下替代方式:
相比於原始的執行方式,使用jar命令方式,讓我們不用再敲入繁瑣的完整包路徑。比如我們知道hadoop-mapreduce-examples專案中還提供了其它的例子,比如計算圓周率的例子,我們只需要記住此應用的簡單名字pi,就可以執行它:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /wordcount/input /wordcount/output/result1
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命令的入口,配置如下:
這決定了使用jar命令執行hadoop-mapreduce-examples-2.6.0.jar包時,實際執行了ExampleDriver的main方法,ExampleDriver的實現如下:<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>
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方法執行的步驟如下:
- 引數長度校驗;
- 根據第一個引數,從programs中查詢對應的ProgramDescription例項;
- 將其餘的引數傳遞給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 申明:我搭建的這個叢集不是