1. 程式人生 > >大資料 (十)Hadoop-第一次使用eclipse&java&hadoop分析簡單資料

大資料 (十)Hadoop-第一次使用eclipse&java&hadoop分析簡單資料

一、開啟eclipse

二、新建java專案mapreducer

三、專案下新建lib資料夾,匯入hadoop相關jar,jar在原始碼中有

四、專案下建包,寫如下三個類

1、WorldCountMapper.java

package com.zjt.mapreducer.data;

import java.io.IOException;

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

/**
 * 執行統計單詞數量的map程式
 * @author ZhangJintao
 * 		Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
 * 			KEYIN ----   輸入資料的鍵
 * 			VALUEIN ----  輸入資料的值
 * 			KEYOUT ---- 輸出資料的鍵
 * 			VALUEOUT ----  輸出資料的值
 */
public class WorldCounteMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
	@Override
	/**
	 * 父類的map方法,迴圈呼叫
	 * 從split碎片段中每行呼叫一次
	 * 把該行所在下標為key,該行的值為value
	 * 【功能:將單詞以map輸出】
	 */
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		String[] words = StringUtils.split(value.toString(), ' ');
		for (String w : words) {
			context.write(new Text(w), new IntWritable(1));
		}
	}
}
2、WorldCountReducer.java
package com.zjt.mapreducer.data;

import java.io.IOException;

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

public class WorldCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
	@Override
	/**
	 * 迴圈呼叫
	 * 洗牌完畢分好組後,每組呼叫一次
	 * 【功能:計算單詞出現次數】
	 */
	protected void reduce(Text arg0, Iterable<IntWritable> arg1,
			Reducer<Text, IntWritable, Text, IntWritable>.Context arg2) throws IOException, InterruptedException {
		int sum = 0 ;
		for(IntWritable i : arg1){
			sum += i.get();
		}
		arg2.write(arg0, new IntWritable(sum));
	}
}
3、RunJob.java
package com.zjt.mapreducer.data;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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;

/**
 * 執行方法
 * @author ZhangJintao
 */
public class RunJob {
	public static void main(String[] args) {
		Configuration config = new Configuration();
		try {
			FileSystem fs = FileSystem.get(config);
			
			Job job = Job.getInstance();
			//執行mapreducer任務
			job.setJarByClass(RunJob.class);
			job.setJobName("data");
			
			job.setMapperClass(WorldCounteMapper.class);
			job.setReducerClass(WorldCountReducer.class);
			
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);
			
			FileInputFormat.addInputPath(job, new Path("/usr/input/"));
			Path outpath  = new Path("/usr/input/data");
			if (fs.exists(outpath)) {
				fs.delete(outpath, true);
			}
			FileOutputFormat.setOutputPath(job, outpath);
			
			boolean f = job.waitForCompletion(true);
			
			if (f) {
				System.out.println("JOB 執行成功");
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
五、打jar包

六、上傳測試資料

       

        其中data.txt內容如下

hadoop hello world
hello hadoop
hbase zookeeper

六、執行程式

        將我們打的jar上傳至任何一臺節點主機,遠端登入節點主機,進入jar包所在目錄,執行如下命令

    hadoop jar wc.jar com.zjt.mapreducer.data.RunJob
        執行後,我們可以看到控制檯會提示資訊。

     

        我們進入網頁http://192.168.1.201:8088/cluster/apps後點擊 Applications可以看到下圖所示

  
       執行完畢之後,在此進入eclipse

       

        重新整理後會發現多瞭如下幾個資料夾和檔案

     

        通過結果檔案可知,她幫我們統計出了data.txt中hadoop單詞有兩個、hbase有一個、hello有兩個、world有一個、zookeeper有一個