MapReduce 常见的编程场景 1

MapReduce 常见的编程场景 11、MapReduce 多 Job 串联1.1、需求1.2、实例2、TopN 算法实现-自定义 GroupComparator2.1、需求2.2、分析3、MapReduce 全局计数器3.1、介绍3.2、需求3.3、实例4、MapJoin-DistributedCache 应用4.1、MapReduce Join 介绍4.2、需求4.3、实现1、MapReduce 多 Job 串联1.1、需求一个稍复杂点的处理逻辑往往需要多个 MapReduce 程序串联处理,多
摘要由CSDN通过智能技术生成

1、MapReduce 多 Job 串联

1.1、需求

一个稍复杂点的处理逻辑往往需要多个 MapReduce 程序串联处理,多 job 的串联可以借助 MapReduce 框架的 JobControl 实现。

1.2、实例

以下有两个 MapReduce 任务,分别是 Flow 的 SumMR 和 SortMR,其中有依赖关系:SumMR 的输出是 SortMR 的输入,所以 SortMR 的启动得在 SumMR 完成之后。

public static void main(String[] args) throws Exception {
   
	Configuration conf = new Configuration();
	Job jobsum = Job.getInstance(conf);
	
	jobsum.setJarByClass(RunManyJobMR.class);
	jobsum.setMapperClass(FlowSumMapper.class);
	jobsum.setReducerClass(FlowSumReducer.class);
	jobsum.setMapOutputKeyClass(Text.class);
	jobsum.setMapOutputValueClass(Flow.class);
	jobsum.setCombinerClass(FlowSumReducer.class);
	jobsum.setOutputKeyClass(Text.class);
	jobsum.setOutputValueClass(Text.class);
	FileInputFormat.setInputPaths(jobsum, "d:/flow/input");
	FileOutputFormat.setOutputPath(jobsum, new Path("d:/flow/output12"));
	
	Job jobsort = Job.getInstance(conf);
	jobsort.setJarByClass(RunManyJobMR.class);
	jobsort.setMapperClass(FlowSortMapper.class);
	jobsort.setReducerClass(FlowSortReducer.class);
	jobsort.setMapOutputKeyClass(Flow.class);
	jobsort.setMapOutputValueClass(Text.class);
	jobsort.setOutputKeyClass(NullWritable.class);
	jobsort.setOutputValueClass(Flow.class);
	FileInputFormat.setInputPaths(jobsort, "d:/flow/output12");
	FileOutputFormat.setOutputPath(jobsort, new Path("d:/flow/sortoutput12"));
	
	ControlledJob sumcj = new ControlledJob(jobsum.getConfiguration());
	ControlledJob sortcj = new ControlledJob(jobsort.getConfiguration());
	sumcj.setJob(jobsum);
	sortcj.setJob(jobsort);
	// 设置作业依赖关系
	sortcj.addDependingJob(sumcj);
	JobControl jc = new JobControl("flow sum and sort");
	jc.addJob(sumcj);
	jc.addJob(sortcj);
	Thread jobThread = new Thread(jc);
	jobThread.start();
	while(!jc.allFinished()){
   
		Thread.sleep(500);
	}
	jc.stop();
}

2、TopN 算法实现-自定义 GroupComparator

2.1、需求

在统计学生成绩的小项目中,现在有一个需求:
求出每个班参考学生成绩最高的学生的信息,班级,姓名和平均分。

2.2、分析

1、利用“班级和平均分”作为 key,可以将 map 阶段读取到的所有学生成绩数据按照班级
和成绩排倒序,发送到 reduce。
2、在 reduce 端利用 GroupingComparator 将班级相同的 kv 聚合成组,然后取第一个即是最
大值。

第一步:先把分组和排序字段都综合到一个自定义对象里

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;

public class ClazzScore implements WritableComparable<ClazzScore>{
   
	private String clazz;
	private Double score;
	public String getClazz() {
   
		return clazz;
	}
	public void setClazz(String clazz) {
   
		this.clazz = clazz;
	}
	public Double getScore() {
   
		return score;
	}
	public void setScore(Double score) {
   
		this.score = score;
	}
	public ClazzScore(String clazz, Double score) {
   
		super();
		this.clazz = clazz;
		this.score = score;
	}
	public ClazzScore() {
   
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
   
		return clazz + "\t" + score;
	}
	@Override
	public void write(DataOutput out) throws IOException {
   
		out.writeUTF(clazz);
		out.writeDouble(score);
	}
	@Override
	public void readFields(DataInput in) throws IOException {
   
		// TODO Auto-generated method stub
		this.clazz = in.readUTF();
		this.score = in.readDouble();
	}
	/**
	* key 排序
	*/
	@Override
	
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值