MapReduce编程练习(一)
2013-01-09 21:24
253 查看
蒙特卡罗概率算法求π值的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的执行流程。
相关文章推荐
- 剑指Offer编程练习009——变态跳台阶
- hadoop编程(8)-MapReduce案例:次排序(Secondary Sort)详解
- C++primer plus第六版课后编程练习答案3.5
- C++primer plus第六版课后编程练习答案4.8
- 【编程练习】将读入的每个单词转换为大写
- C++primer plus第六版课后编程练习答案6.2
- Leetcode编程练习一:盗马三则
- [编程练习][Two Sum]<LeetCode-1>
- c++.primer.plus第五版第八章编程练习答案
- Hadoop—MapReduce计算气象温度等例子---练习
- [编程练习][Longest Substring Without Repeating Characters]<LeetCode-3>
- C语言复习——结构体编程练习
- shell 编程实例练习(二)
- C++primer plus第六版课后编程练习答案10.4
- C Primer Plus 第四章 编程练习 1-7题
- python核心编程十四章练习
- C Primer Plus 第十四章 编程练习 1-11题
- 【Java语言程序设计】第一章编程练习
- 算法(第四版 Robert Sedgewick)课后练习答案 1.1 基础编程模型