ZKe

-----------------

  在MapReduce框架中,Mapper的输出在Shuffle阶段,根据Key值分组之后,还将会根据Key值进行排序,因此Reducer的输出我们看到的结果是按Key有序的。

  同样我们可以让它按Value有序。通过job.setSortComparatorClass(IntWritableComparator.class);即可(这里的排序规则和类型通过自己定义)

  实体类不仅需要实现Comparable接口,同样还要重写readFiles方法和write方法。然后定义一个该实体的比较器。

  这里定义一个实体类,由String的id和int的count作为属性,我们根据count进行排序。

static class Record implements Comparable<Record>{

        private String personalId;
private int count; public Record(String id, int count){
this.personalId = id;
this.count = count;
}
public Record(String line){
this.personalId = line.split("\t")[0];
this.count = Integer.parseInt(line.split("\t")[1]);
} /*
* 反序列化方法
* @author 180512235 ZhaoKe
*/
public void readFields(DataInput arg0) throws IOException {
this.personalId = arg0.readUTF();
this.count = arg0.readInt();
} // 序列化方法
public void write(DataOutput arg0) throws IOException {
arg0.writeUTF(this.personalId);
arg0.writeInt(this.count);
} public int compareTo(Record o) {
// TODO Auto-generated method stub
return this.count<o.count?1:-1;
}
public String getPersonalId(){
return this.personalId;
} public int getCount(){
return this.count;
} }

它的比较器如下

    static class IntWritableComparator extends WritableComparator {

        /*
* 重写构造方法,定义比较类 IntWritable
*/
public IntWritableComparator() {
super(IntWritable.class, true);
}
/*
* 重写compare方法,自定义比较规则
*/
@Override
public int compare(WritableComparable a, WritableComparable b) {
//向下转型
IntWritable ia = (IntWritable) a;
IntWritable ib = (IntWritable) b;
return ib.compareTo(ia);
}
}

Mapper和Reducer如下,没有任何操作,因为Shuffle阶段自己会调用比较器进行排序

    static class SortMapper extends Mapper<LongWritable, Text, IntWritable, Text>{
private Record r;
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
r = new Record(value.toString());
context.write(new IntWritable(r.getCount()), new Text(r.getPersonalId()));
}
}
static class SortReducer extends Reducer<IntWritable, Text, Text, IntWritable>{ protected void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException{ for(Text value:values){
context.write(value, key);
}
}
}

主类如下,大家作为模板即可

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// TODO Auto-generated method stub
String inputFile = "hdfs://master:9000/user/root/finalClassDesign/originData/submitTop10output/"; String outputFile = "hdfs://master:9000/user/root/finalClassDesign/originData/sortedSubmitTop10/";
BasicConfigurator.configure();
Configuration conf = new Configuration();
// String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
// if(otherArgs.length != 2){
// System.err.println("Usage:wordcount<in><out>");
// System.exit(2);
// } Job job = Job.getInstance(conf, "WordCount"); job.setJarByClass(SortByMapReduce.class); job.setMapperClass(SortMapper.class);
job.setReducerClass(SortReducer.class); job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); job.setSortComparatorClass(IntWritableComparator.class); // 此处必须注意设置比较器======================================= // Path path = new Path(otherArgs[1]);
Path path = new Path(outputFile);
FileSystem fileSystem = path.getFileSystem(conf);
if(fileSystem.exists(path)){
fileSystem.delete(path, true);
} // FileInputFormat.setInputPaths(job, new Path(args[0]));
// FileOutputFormat.setOutputPath(job, new Path(args[1]));
FileInputFormat.setInputPaths(job, new Path(inputFile));
FileOutputFormat.setOutputPath(job, new Path(outputFile)); boolean res = job.waitForCompletion(true);
if(res)
System.out.println("===========waitForCompletion:"+res+"==========");
System.exit(res?0:1);
}

MapReduce在Shuffle阶段按Mapper输出的Value进行排序的更多相关文章

  1. MapReduce详解及shuffle阶段

    hadoop1.x和hadoop2.x的区别: Hadoop1.x版本: 内核主要由Hdfs和Mapreduce两个系统组成,其中Mapreduce是一个离线分布式计算框架,由一个JobTracker ...

  2. 【Hadoop】MapReduce笔记(三):MapReduce的Shuffle和Sort阶段详解

    一.MapReduce 总体架构 整体的Shuffle过程包含以下几个部分:Map端Shuffle.Sort阶段.Reduce端Shuffle.即是说:Shuffle 过程横跨 map 和 reduc ...

  3. MapReduce shuffle阶段详解

    在Mapreduce中,Shuffle过程是Mapreduce的核心,它分布在Mapreduce的map阶段和reduce阶段,共可分为6个详细的阶段: 1).Collect阶段:将MapTask的结 ...

  4. MapReduce核心 - - - Shuffle

    大数据名词(1) -Shuffle     Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每 ...

  5. MapReduce:Shuffle过程详解

    1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数.                <0,hello you>   & ...

  6. 大数据技术 - MapReduce的Shuffle及调优

    本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要 ...

  7. MapReduce的Shuffle过程介绍

    MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌.混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好.MapReduce中的Shuffle更像是洗牌的逆过程,把一 ...

  8. Hadoop MapReduce的Shuffle过程

    一.概述 理解Hadoop的Shuffle过程是一个大数据工程师必须的,笔者自己将学习笔记记录下来,以便以后方便复习查看. 二. MapReduce确保每个reducer的输入都是按键排序的.系统执行 ...

  9. MapReduce 的 shuffle 过程中经历了几次 sort ?

    shuffle 是从map产生输出到reduce的消化输入的整个过程. 排序贯穿于Map任务和Reduce任务,是MapReduce非常重要的一环,排序操作属于MapReduce计算框架的默认行为,不 ...

随机推荐

  1. Arduino 寻找I2C地址address

    参考:http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-quick-tip-fin ...

  2. Inno Setup 5打包exe遇到的坑,做一个学习记录

    ; 脚本由 Inno Setup 脚本向导 生成!; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "人员管理系统"#de ...

  3. 深入研究RocketMQ消费者是如何获取消息的

    前言 小伙伴们,国庆都过的开心吗?国庆后的第一个工作日是不是很多小伙伴还沉浸在假期的心情中,没有工作状态呢? 那王子今天和大家聊一聊RocketMQ的消费者是如何获取消息的,通过学习知识来找回状态吧. ...

  4. SpringCould中的Hystrix

    一.简介 源码地址:https://gitee.com/xiaocheng0902/my-cloud.git 1,定义 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多 ...

  5. Github个人首页美化指北

    当你尝试去创建一个与你Github用户名相同的仓库时,会发现这是Github为你预留的特殊仓库,用来作为你的Github Profile,这个仓库就相当于一个可以显示在你Github个人页的READM ...

  6. Python+Appium自动化测试(15)-使用Android模拟器(详细)

    做APP的UI自动化测试时,我们往往会使用真机跑自动化测试脚本,因为这样才是最真实的使用场景.但前期调试脚本的话,可以先使用模拟器,这样相对更加方便. 不推荐使用Android SDK里自带模拟器,太 ...

  7. 用ip xfrm搭ipsec隧道

    拓扑如下 基本的IP配置就不说了,直接写重点,在LS上配置 #配置SA ip xfrm state add src 194.168.10.4 dst 194.168.10.5 proto esp sp ...

  8. day05 Pyhton学习总结

    1.字符串str s1="asasd",字符串不能修改 修改以后只能赋值给另一个变量 ret1=s1 1.切片 s1[0], s1[-1], s1[2:4], s1[-1:-4:- ...

  9. linux(centos8):prometheus使用alertmanager发送报警邮件(prometheus 2.18.1/alertmanager 0.20.0)

    一,alertmanager的用途 1,Alertmanager的作用: Alertmanager是一个独立的报警模块, 它接收Prometheus等客户端发来的警报,并通过分组.删除重复等处理, 通 ...

  10. Go语言中Goroutine与线程的区别

    1.什么是Goroutine? Goroutine是建立在线程之上的轻量级的抽象.它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法.相比于线程,它的创建和销毁的代价要小很多,并且它 ...