MapReduce编程练习(一)

蒙特卡罗概率算法求π值的MapReduce并行实现

 

分析:我们可以按如下方法让计算变得可并行化:

1. 在正方形内随机地生成一些点
2. 计算这些点在圆形内的个数
3. p = 圆形内的点的个数
正方形内的点的个数
4. π = 4p

 

代码:(注:为了简单起见,我选用正方形1/4区域计算)

(1)Driver:
public class piDriver {
	public static void main(String args[]) throws IOException, InterruptedException, ClassNotFoundException{
		getData.data();//生成一组随即坐标点
		IHDFSOperator hdfs=new HDFSOperator();
		hdfs.putFile("/home/server/list/data.txt", "hdfs://localhost:9000/input/data.txt");//将写有坐标点的文件上传到HDFS
		Configuration conf =new Configuration();
		Job job=new Job(conf,"Calculate pi");
		job.setJarByClass(piDriver.class);
		job.setMapperClass(piMap.class);
		job.setCombinerClass(piCombiner.class);
		job.setReducerClass(piReduce.class);
		job.setInputFormatClass(KeyValueInputFormat.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/input/data.txt"));
		FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/output"));
		job.waitForCompletion(true);
	}

}

(2)Mapper:
public class piMap extends Mapper<Text,Text,Text,IntWritable>{
	Text countCircle=new Text();
	IntWritable number=new IntWritable();
	
	public void map(Text key,Text value,Context context)
	                    throws IOException, InterruptedException{
		int num=0;
		String point=value.toString();
		String xy[]=point.split(",");
		Float x=Float.parseFloat(xy[0]);
		System.out.println("x="+x);
		Float y=Float.parseFloat(xy[1]);
		System.out.println("y="+y);
		if(x*x+y*y<=1)//计算所标是否在圆内
			num++;
		System.out.println("num="+num);
		countCircle.set("countCircle");
	    number.set(num);
	    
	    context.write(countCircle, number);
		
	}

}
(3)Combiner:
public class piCombiner extends Reducer<Text,IntWritable,Text,IntWritable> {//将一个任务分片的所有map输出做一个汇总
	Text temp=new Text();
	IntWritable plus=new IntWritable();
	public void reduce(Text key,Iterable<IntWritable> values ,Context context)
    throws IOException, InterruptedException{
		int sum=0;
		for(IntWritable value:values){
			sum+=value.get();
		}
		temp.set("countCircle");
		plus.set(sum);
		context.write(temp, plus);
	}

}

 

(4)Reducer:
public class piReduce extends Reducer<Text,IntWritable,Text,FloatWritable>{
	Text pi=new Text();
	FloatWritable result=new FloatWritable();
	public void reduce(Text key,Iterable<IntWritable> values ,Context context)
	                        throws IOException, InterruptedException{
		int countCircle=0;
		for(IntWritable value:values){
			System.out.println(value);
			countCircle+=value.get();
		}
		float re=(float) (4*(countCircle/10000.0));//计算pi
		pi.set("pi");
		result.set(re);
		context.write(pi, result);
	}

}

 

回顾这个程序,发现这和WordCount很像,难度也差不多,算是很简单的一类处理。比较适合像和我一样的hadoop新手编程练习,从中可以学习到MapReduce的执行流程。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值