1. 程式人生 > >hadoop上的兩種執行mapreduce程式的方法

hadoop上的兩種執行mapreduce程式的方法

之前學習了一段時間的hadoop的相關知識 ,學習理論基礎的時候要同時實際操作才能對它更熟練,廢話不多說來說說在hadoop上執行一個最簡單的words count的程式

首先我先貼上這個程式的原始碼 供大家參考 程式碼分為三個部分寫的Run、 map階段、 reduce階段

Map:

package wordsCount;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordsMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		
		String line = value.toString();
		StringTokenizer st = new StringTokenizer(line);
		while(st.hasMoreTokens()){
			String word = st.nextToken();
			context.write(new Text(word), new IntWritable(1));
		}
		
	}

}

Reduce:
package wordsCount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordsReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
	
	@Override
	protected void reduce(Text key, Iterable<IntWritable> iterator,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		// TODO 自動生成的方法存根
		int sum = 0;
		for(IntWritable i:iterator){
			sum = sum + i.get();
		}
		context.write(key, new IntWritable(sum));
	}
}
Run:
package wordsCount;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class Run {

	public static void main(String[] args) throws Exception{
		// TODO 自動生成的方法存根
		Configuration configuration = new Configuration();
		Job job = new Job(configuration);
		job.setJarByClass(Run.class);
		job.setJobName("words count!");
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		job.setInputFormatClass(TextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		
		job.setMapperClass(WordsMapper.class);
		job.setReducerClass(WordsReduce.class);
		
		FileInputFormat.addInputPath(job, new Path("hdfs://192.168.1.111:9000/user/input/wc/"));
		FileOutputFormat.setOutputPath(job,new Path("hdfs://192.168.1.111:9000/user/result/"));

		job.waitForCompletion(true);
	}
}

Run裡面的輸入和輸出路徑根據自己的來修改

這個程式就不用去講解了吧 到處都能找到

首先在hadoop上執行這個程式用兩個方法

方法一:將自己的編譯軟體與hadoop相連(我用的是MyEclipse去連結hadoop),直接執行程式。MyEclipse連線hadoop的教程待會我會在文章結尾處給出一個連結供大家參考。


看到下面的資訊就表示你成功了 然後你在再到你的輸出資料夾裡面就能檢視執行的結果了


第二個檔案裡面的內容就是輸出結果



第二種方法:將mapreduce程式打包成jar檔案

這裡簡單的說一下打包的方法


然後下一步,完成就可以了

將打包好的jar檔案傳到你的裝hadoop的機器上(我的hadoop叢集是裝在linux虛擬機器中的)用SSH把jar傳過去之後:

在你安裝hadoop的目錄下的bin目錄下有一個hadoop的可執行檔案,然後執行下面的操作就可以了:


來解釋下我的shell語句

/home/xiaohuihui/wordscount.jar:打包之後的jar檔案的所在位置(傳到虛擬機器中位置)

wordsCount/Run:這個位你的jar包中的主函式(這裡的主函式就是Run.class)的名字 可以開啟你的jar檔案檢視便知道

還可以在這個語句之後加上你的輸入和輸出的檔案路徑,但是這個我已經在我的程式中設定了

如果你執行上面的shell語句之後看到下面的輸出,那恭喜你,成功了!!



檢視結果你可通過在你的Eclipse連線好hadoop檢視,還可以通過在hdfs檔案系統的網頁去檢視(localhost:50070)。

還有一個很重要的一步就是,執行之前保證你的hadoop已經啟動了,可以通過jps來檢視你的程序中是否已經啟動hadoop叢集

Eclipse連線hadoop:http://blog.csdn.net/xjavasunjava/article/details/12320045