在hadoop集群里使用mapruduce求pi的代码加注释
时间: 2024-03-10 15:49:30 浏览: 23
好的,下面是在Hadoop集群上使用MapReduce求pi值的代码及注释:
1. mapper代码:
```java
import java.io.IOException;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
public class PiMapper extends Mapper<Object, Text, IntWritable, LongWritable> {
private final static IntWritable one = new IntWritable(1);
private LongWritable data = new LongWritable();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
int numSamples = Integer.parseInt(value.toString());
int inCircle = 0;
for (int i = 0; i < numSamples; i++) {
double x = Math.random();
double y = Math.random();
if (x * x + y * y <= 1) {
inCircle++;
}
}
data.set(inCircle);
context.write(one, data);
}
}
```
注释:
- 第1行:导入必要的类;
- 第3行:定义Mapper类;
- 第4-5行:定义Map函数输入的键和值类型;
- 第6-8行:定义Map函数的输出类型;
- 第10-11行:定义一个IntWritable类型的常量one,值为1;
- 第12行:定义一个LongWritable类型的数据;
- 第14-19行:实现Map函数,将输入的字符串转换成整数,然后使用蒙特卡罗算法计算pi值;
- 第20行:将inCircle的值封装到data中;
- 第21行:将结果输出到上下文中。
2. reducer代码:
```java
import java.io.IOException;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
public class PiReducer extends Reducer<IntWritable, LongWritable, Text, NullWritable> {
private Text pi = new Text();
public void reduce(IntWritable key, Iterable<LongWritable> values, Context context)
throws IOException, InterruptedException {
long inCircle = 0;
long total = 0;
for (LongWritable val : values) {
inCircle += val.get();
total++;
}
double ratio = (double) inCircle / (double) total;
double piEstimate = ratio * 4.0;
pi.set("Estimated value of Pi is " + piEstimate);
context.write(pi, NullWritable.get());
}
}
```
注释:
- 第1行:导入必要的类;
- 第3行:定义Reducer类;
- 第4-5行:定义Reduce函数输入的键和值类型;
- 第6-8行:定义Reduce函数的输出类型;
- 第10行:定义一个Text类型的变量pi;
- 第12-19行:实现Reduce函数,计算出所有Mapper输出的数据中圆内的点数和总点数,并计算出pi值;
- 第21行:将pi值封装到Text中;
- 第22行:将结果输出到上下文中。
3. 驱动程序代码:
```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
public class PiJob {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "pi estimation");
job.setJarByClass(PiJob.class);
job.setMapperClass(PiMapper.class);
job.setReducerClass(PiReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(LongWritable.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
TextInputFormat.addInputPath(job, new Path(args[0]));
TextOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
注释:
- 第1-3行:导入必要的类;
- 第5行:定义主函数;
- 第6-8行:创建Configuration对象和Job对象;
- 第10-11行:设置MapReduce作业的Jar包;
- 第12-13行:设置Mapper和Reducer类;
- 第15-16行:设置输出键和值的类型;
- 第18-19行:设置Map输出键和值的类型;
- 第21-22行:设置输入和输出的文件格式;
- 第24-25行:设置输入和输出的路径;
- 第27行:运行MapReduce作业,并退出程序。
以上就是在Hadoop集群上使用MapReduce求pi值的代码及注释。