Mapreduce 小例子

对应与map,reduce函数操作列举个小例子,操作平台eclipse与hadoop。输入文件要求:可以是一行对应多个字段,且每个字段需要使用空格分割。

Test_1:

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class Test_1 extends Configured implements Tool{

	/**
	 * @Author XD 2014-8-15
	 */
	enum Counter{
		LINESKIP,	//对应于出错行的计数
	}
	public static class Map extends Mapper<LongWritable,Text,NullWritable,Text>{
		public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
			//读取源文件,line得到的是输入一行的数据
			String line = value.toString();
			try{
				//对文件进行分割
				String[] lineSplit = line.split(" ");
				String name = lineSplit[0];
				String id = lineSplit[2];
				String school = lineSplit[3];
				Text out = new Text(name+' '+id+' '+school+' ');

				context.write( NullWritable.get(),out);//要与上面的Mapper接口中的输入输出类型匹配

			}catch(java.lang.ArrayIndexOutOfBoundsException e){
				context.getCounter(Counter.LINESKIP).increment(1);
				return;
			}
		}

	}
	public int run(String[] args)  throws  Exception{
		//配置,初始化作业
		Configuration conf = getConf();
		Job job = new Job(conf,"Test_1");
		job.setJarByClass(Test_1.class);

		//设置输入输出路径
		FileInputFormat.addInputPath(job,new Path(args[0]));
		FileOutputFormat.setOutputPath(job,new Path(args[1]));

		//设置处理map的处理类
		job.setMapperClass(Map.class);
		job.setOutputFormatClass(TextOutputFormat.class);

		//设置map输出类型
		job.setOutputKeyClass(NullWritable.class);
		job.setOutputValueClass(Text.class);

		job.waitForCompletion(true);

		System.out.println("任务名称: "+job.getJobName());
		System.out.println("任务成功: "+(job.isSuccessful()?"Yes":"No"));
		System.out.println("跳过行数:"+job.getCounters().findCounter(Counter.LINESKIP).getValue());

		return job.isSuccessful()? 0:1;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	 try {
		int result = ToolRunner.run(new Configuration(),new Test_1(),args);
		System.out.println(result);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}

}

此例并不具备reduce函数,只是一个简单的map处理。

Test_2:

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class Test_2 extends Configured implements Tool{

	/**
	 * @Author XD 2014-8-15
	 */
	enum Counter{
		LINESKIP,
	}
	public static class Map extends Mapper<LongWritable,Text,Text,Text>{
		public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
			//读取源文件,line得到的是输入一行的数据
			String line = value.toString();
			try{
				String[] lineSplit = line.split(" ");
				String anum = lineSplit[0];
				String bnum = lineSplit[1];
				context.write(new Text(bnum),new Text(anum));

			}catch(java.lang.ArrayIndexOutOfBoundsException e){
				context.getCounter(Counter.LINESKIP).increment(1);
				return;
			}
		}

	}
	public static class Reduce extends Reducer<Text,Text,Text,Text>{
		public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException{
			String valueString;
			String out = "";
			//对于map产生的数据进行reduce 处理
			for(Text value : values){
				valueString = value.toString();
				out += valueString+"|";
			}
			//reduce 输出
				context.write(key,new Text(out));
		}

	}
	public int run(String[] args)  throws  Exception{
		//作业初始化
		Configuration conf = getConf();
		Job job = new Job(conf,"Test_2");
		job.setJarByClass(Test_2.class);

		//输入输出路径
		FileInputFormat.addInputPath(job,new Path(args[0]));
		FileOutputFormat.setOutputPath(job,new Path(args[1]));

		//处理map,reduce的类
		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);
		job.setOutputFormatClass(TextOutputFormat.class);

		//reduce的输出类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);

		job.waitForCompletion(true);

		System.out.println("任务名称: "+job.getJobName());
		System.out.println("任务成功: "+(job.isSuccessful()?"Yes":"No"));
		System.out.println("跳过行数:"+job.getCounters().findCounter(Counter.LINESKIP).getValue());

		return job.isSuccessful()? 0:1;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	 try {
		int result = ToolRunner.run(new Configuration(),new Test_2(),args);
		System.out.println(result);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}

}

此例对应与map,reduce操作,只是个简单的小例子,只是为了实验运行环境,并不代表什么。书写程序的工作,可以在eclipse下面进行,这样易于修改和调试。但是运行建议在终端输入命令运行...

Mapreduce 小例子

时间: 2024-11-05 23:29:21

Mapreduce 小例子的相关文章

Hadoop mapreduce 数据去重 数据排序小例子

数据去重: 数据去重,只是让出现的数据仅一次,所以在reduce阶段key作为输入,而对于values-in没有要求,即输入的key直接作为输出的key,并将value置空.具体步骤类似于wordcount: Tip:输入输出路径配置. import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop

《hadoop权威指南》关于hive的第一个小例子的演示

本文是<hadoop权威指南>关于hive的小例子,通过这个例子可以很好地看出来hive是个什么东西. 前提是已经配置好hive的远程连接版本的环境,我是用了MYSQL数据库保存元数据. 环境要求: -配置好了Hadoop的HDFS文件系统,启动hdfs和yarn -配置好了hive的远程连接模式 -配置好了MySQL用于metadata的储存 输入文件下载: https://github.com/tomwhite/hadoop-book/blob/master/input/ncdc/micr

laravel 数据库操作小例子

public function demo() { $res = null; //insert数据插入 //$user=array('username'=>'joy','password'=>'123456','age'=>23); //$res = DB::table('users')->insert($user); /* 数据查询 $res = DB::table('users')->where('username','joy')->get(); $res = DB:

spring小例子-springMVC+mybits整合的小例子

这段时间没更博,找房去了...   吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了..   搬家太受罪了... 今天更一下springMVC整合mybits形成最简单的网站demo. 大概效果就是这样的:左边是数据库查询结果,右边是页面访问结果: 首先,一个简单的springMVC小例子可以看这个http://www.cnblogs.com/xuejupo/p/5236448.html 这是在这

cmake 之一个小例子

cmake,比手写makefile更好的选择 安装cmake,此部分略过 一.新建一个工程 这里我是在windows下使用eclipse新建了一个c工程(PS:我一般新建一个Makefile类型的工程,这样比较干净) 二.建立必要的文件夹 我的工程目录: D:\code\cpp\cmakestudy\test>tree /f 卷 软件 的文件夹 PATH 列表 卷序列号为 0006-17B7 D:. │ .cproject │ .project │ CMakeLists.txt │ ├─bin

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO

COM2 --- 小例子

在COM1 的小例子中,,我们大概知道什么是组件类 ,什么是接口了.这小节呢,我们来实现一下由一个组件类去实现两个接口的过程. 新建项目: 我们的 解决方案的 名字是 ComDemoCode ,项目名字是 MathToolKit  这表示 我们的 项目 自动 生成的 DLL  的名字就是 MathToolKit(数学工具包). 我们的继承关系 有必要 给大家 先 列出来,让大家 看看 在这里面,IPrimerMath接口 提供 + - * / % 五个基本运算方法,IAdvanceMath接口提

python try小例子

#!/usr/bin/python import telnetlib import socket try: tn=telnetlib.Telnet('10.67.21.29',60000) except socket.error, e: print e exit(1) tn.set_debuglevel(1) tn.write('quit'+'\n') print 'ok' socket.error为错误类型 e为对象 python try小例子,布布扣,bubuko.com

C/C++ New与Delete (小例子)

转自:http://blog.csdn.net/chenzujie/article/details/7011639 先来看两段小程序: 1). #include <iostream.h> #include <String.h> void main(void) { char *str1 = "just have fun"; char *str2 = "happy day"; char *sTmpPtr = new char[255]; char