1. 程式人生 > >Hadoop--使用JavaAPI編寫wordcount的jar包

Hadoop--使用JavaAPI編寫wordcount的jar包


GitHub:https://github.com/GYT0313/Hadoop-JavaAPI-Code/tree/master/chapter4/wordcount

1.建立專案

建立三個類:
Mapper、Reducer、Main驅動類(需要匯入 jar包)
在這裡插入圖片描述

2.程式碼

  1. WordMapper.java:
package wordcount;


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

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


/**
 * @author: Gu Yongtao
 * @Description: 
 * @date: 2018年11月6日 下午4:17:05
 * @Filename: WordMapper.java
 */

public class WordMapper extends Mapper<Object, Text, Text, IntWritable> {
	private final static IntWritable one = new IntWritable(1);
	private Text word = new Text();
	
	// Mapper類的核心方法
	/**
	 *  key 首字元偏移量
	 *  value 檔案的一行內容
	 *  context Mapper端的上下文
	 * @throws InterruptedException 
	 * @throws IOException 
	 */
	public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
		StringTokenizer itr = new StringTokenizer(value.toString()); // 分割輸入行為key,預設以空格/回車...分割
		while (itr.hasMoreTokens()) {
			word.set(itr.nextToken());
			context.write(word, one);
		}
	}	
}
分析:StringTokenizer itr = new StringTokenizer(value.toString());

在這裡插入圖片描述

  1. WordReducer.java:
package wordcount;

import java.io.IOException;

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

/**
 * @author: Gu Yongtao
 * @Description: 
 * @date: 2018年11月6日 下午4:40:16
 * @Filename: WordReducer.java
 */

public class WordReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
	private IntWritable result = new IntWritable();  // 記錄詞的頻數
	
	// Reducer抽象類的核心方法
	public void reduce (Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
		int sum = 0;
		// 遍歷values 將 list<value> 疊加
		for (IntWritable value : values) {
			sum += value.get();
		}
		result.set(sum);
		context.write(key, result);
	}
}
  1. WordMain.java:(IP地址根據自身叢集配置)
package wordcount;

import java.io.IOException;

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.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

/**
 * @author: Gu Yongtao
 * @Description: 
 * @date: 2018年11月6日 下午4:53:59
 * @Filename: WordMain.java
 */

public class WordMain {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		// Configuration類:讀取配置檔案內容-core-site.xml
		Configuration conf = new Configuration();
		
		// 讀取命令列引數,並設定到conf
		String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
		
		if (otherArgs.length != 2) { // 輸入目錄 輸出目錄
			System.err.println("Usage: wordcount <in><out>");
			System.exit(2);
		}
		
		Job job = new Job(conf, "word count"); // 新建一個job
		job.setJarByClass(WordMain.class); // 設定主類
		job.setMapperClass(WordMapper.class); // 設定Mapper類
		job.setCombinerClass(WordReducer.class); // 設定作業合成類
		job.setReducerClass(WordReducer.class); // 設定Reducer類
		job.setOutputKeyClass(Text.class); // 設定輸出資料的關鍵類
		job.setOutputValueClass(IntWritable.class); // 設定輸出值類
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
		System.exit(job.waitForCompletion(true) ? 0 : 1);		
	}
}

3.匯出jar包:

右鍵專案,點選Export:
在這裡插入圖片描述
選擇 JAR file:
在這裡插入圖片描述
點選Next,勾選wordcount工程中的 src,並選擇儲存的路徑名(包含最終的檔名),點選Finish:
在這裡插入圖片描述
匯出的jar包:
在這裡插入圖片描述

4.執行jar包

執行格式:

hadoop jar [jar 檔案位置] [jar 主類] [HDFS 輸入路徑] [HDFS 輸出路徑]

準備輸入檔案:使用hdfs shell命令寫入檔案內容(-appendToFile使用ctrl + c結束 | 也可以使用-put 上傳本地檔案)
在這裡插入圖片描述

執行任務:
hadoop jar /home/hadoop/jar/wordcount.jar wordcount.WordMain /data/wordcount.txt /output/wordcount3

在這裡插入圖片描述

檢視輸出:

在這裡插入圖片描述

總結:

使用JavaAPI編寫wordcount例項,可以根據自己需要設定分隔符,而不再單純的以空格/回車… 為分割。
只需要設定StringTokenizer的例項即可,如:
StringTokenizer itr = new StringTokenizer(value.toString());