MapReduce的代码编写

本文详细介绍MapReduce编程的具体步骤,从创建配置对象到设置输入输出路径,再到Map和Reduce函数的编写,最后通过实例代码展示了WordCount应用的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MapReduce用例代码的编写流程

       1)函数入口
              ①首先创建配置对象Configuration,用于加载配置文件的信息;
              ②创建一个Job对象,通过getInstance()函数设置当前main函数所在的类,设置后运行代码可以找到函数的入口;
              ③设置MapReduce的输入输出路径用于输入数据和输出计算的数据结果;    注意若要是输出的路径在集群中已经存在,需要操作HDFS进行判断与删除,在此处要建立一个HDFS的FileSystem对象。
              ④设置map端,确定map的class以及map端的输出的key和value的类型;
              ⑤设置Reduce的class,可以设置reduceTask的数量
              ⑥job对象设置waitForCompletion,设置为true打印MapReduce的执行信息。
       2)Map端的函数编写
              ①类输入的参数类型为:block的偏移量;输入的内容(其类型都是hadoop专有的类型分别为LongWritable,Text)。类输出的类型为:Text和IntWritable。
              ②重写map函数,编写逻辑对数据进行清洗和处理成reduce端能接收的数据。
      3)Reduce端函数编写
              ①类输入的参数类型受map端输出类型的影响,map端输出什么类型的数据,reduce端接收什么类型的数据
              ②reduce端重写reduce方法,对数据进行进一步的处理,得到想要的结果,通过context.write写出数据。
例子代码(WordCount字数统计小demo)
main函数类:

public class WC {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		Configuration conf = new Configuration(true);
		
		
		Job job = Job.getInstance(conf);
		//设置当前main函数所在类
		job.setJarByClass(WC.class);
		job.setJar("d:/wc.jar");
		
		
		//设置输入路径
		FileInputFormat.setInputPaths(job, "/input/wc");
		//设置输出路径
		Path outputPath = new Path("/output/");
		FileSystem fs = outputPath.getFileSystem(conf);	
		if(fs.exists(outputPath)){
			fs.delete(outputPath,true);
		}
		FileOutputFormat.setOutputPath(job, outputPath);
		
		//设置Map class
		job.setMapperClass(WCMapper.class);
		//设置map输出key、value的类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		
		//设置reduce class
		job.setReducerClass(WCReduce.class);
		
		job.setNumReduceTasks(2);
		
		job.waitForCompletion(true);
	}
}

map类

public class WCMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
	Text myKey = new Text();
	IntWritable myValue = new IntWritable(1);
	@Override
	protected void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {
		System.out.println(key+"==========");
//		value.toString().split(" ")
		String[] words = StringUtils.split(value.toString(), ' ');
		for (String word : words) {
			myKey.set(word);
			context.write(myKey,myValue);
		}
	}
}

reduce类

public class WCReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
		 int sum = 0;
		 for (IntWritable value : values) {
			sum += value.get();
		}
		 context.write(key, new IntWritable(sum));
	}
}

MapReduce代码编写总结:
1.自定义对象时要实现WritableComparable接口
    要实现序列化和反序列化方法以及CompareTo方法
2.实现Mapper类要继承Mapper抽象类
3.实现Reduce类要继承Reduce抽象类
4.自定义分组器要继承一个WritableComparator抽象类,还要调用构造函数
5.自定义排序器要继承WritableComparator抽象类
6.自定义分区器要继承一个partioner抽象类
7.combiner可以直接指向reduce.class,因为都是小聚合,实现类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值