一、辅助排序

  需求:先有一个订单数据文件,包含了订单id、商品id、商品价格,要求将订单id正序,商品价格倒序,且生成结果文件个数为订单id的数量,每个结果文件中只要一条该订单最贵商品的数据。

  思路:1.封装订单类OrderBean,实现WritableComparable接口;

     2.自定义Mapper类,确定输入输出数据类型,写业务逻辑;

     3.自定义分区,根据不同的订单id返回不同的分区值;

     4.自定义Reducer类;

     5.辅助排序类OrderGroupingComparator继承WritableComparator类,并定义无参构成方法、重写compare方法;

     6.书写Driver类;

  代码如下:

/**
* @author: PrincessHug
* @date: 2019/3/25, 21:42
* @Blog: https://www.cnblogs.com/HelloBigTable/
*/
public class OrderBean implements WritableComparable<OrderBean> {
private int orderId;
private double orderPrice; public OrderBean() {
} public OrderBean(int orderId, double orderPrice) {
this.orderId = orderId;
this.orderPrice = orderPrice;
} public int getOrderId() {
return orderId;
} public void setOrderId(int orderId) {
this.orderId = orderId;
} public double getOrderPrice() {
return orderPrice;
} public void setOrderPrice(double orderPrice) {
this.orderPrice = orderPrice;
} @Override
public String toString() {
return orderId + "\t" + orderPrice;
} @Override
public int compareTo(OrderBean o) {
int rs ;
if (this.orderId > o.getOrderId()){
rs = 1;
}else if (this.orderId < o.getOrderId()){
rs = -1;
}else {
rs = (this.orderPrice > o.getOrderPrice()) ? -1:1;
}
return rs;
} @Override
public void write(DataOutput out) throws IOException {
out.writeInt(orderId);
out.writeDouble(orderPrice);
} @Override
public void readFields(DataInput in) throws IOException {
orderId = in.readInt();
orderPrice = in.readDouble();
}
} public class OrderMapper extends Mapper<LongWritable, Text,OrderBean, NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//获取数据
String line = value.toString(); //切割数据
String[] fields = line.split("\t"); //封装数据
int orderId = Integer.parseInt(fields[0]);
double orderPrice = Double.parseDouble(fields[2]);
OrderBean orderBean = new OrderBean(orderId, orderPrice); //发送数据
context.write(orderBean,NullWritable.get());
}
} public class OrderPartitioner extends Partitioner<OrderBean, NullWritable> {
@Override
public int getPartition(OrderBean orderBean, NullWritable nullWritable, int i) {
//构造参数中i的值为reducetask的个数
return (orderBean.getOrderId() & Integer.MAX_VALUE ) % i;
}
} public class OrderReducer extends Reducer<OrderBean, NullWritable,OrderBean,NullWritable> {
@Override
protected void reduce(OrderBean key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
context.write(key,NullWritable.get());
}
} public class OrderGrouptingComparator extends WritableComparator {
//必须使用super调用父类的构造方法来定义对比的类为OrderBean
protected OrderGrouptingComparator(){
super(OrderBean.class,true);
} @Override
public int compare(WritableComparable a, WritableComparable b) {
OrderBean aBean = (OrderBean)a;
OrderBean bBean = (OrderBean)b; int rs ;
if (aBean.getOrderId() > bBean.getOrderId()){
rs = 1;
}else if (aBean.getOrderId() < bBean.getOrderId()){
rs = -1;
}else {
rs = 0;
}
return rs;
}
} public class OrderDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//配置信息,Job对象
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); //执行类
job.setJarByClass(OrderBean.class); //设置Mapper、Reducer类
job.setMapperClass(OrderMapper.class);
job.setReducerClass(OrderReducer.class); //设置Mapper输出数据类型
job.setMapOutputKeyClass(OrderBean.class);
job.setMapOutputValueClass(NullWritable.class); //设置Reducer输出数据类型
job.setOutputKeyClass(OrderBean.class);
job.setOutputValueClass(NullWritable.class); //设置辅助排序
job.setGroupingComparatorClass(OrderGrouptingComparator.class); //设置分区类
job.setPartitionerClass(OrderPartitioner.class); //设置reducetask数量
job.setNumReduceTasks(3); //设置文件输入输出流
FileInputFormat.setInputPaths(job,new Path("G:\\mapreduce\\order\\in"));
FileOutputFormat.setOutputPath(job,new Path("G:\\mapreduce\\order\\out")); //提交任务
if (job.waitForCompletion(true)){
System.out.println("运行完成!");
}else {
System.out.println("运行失败!");
}
}
}

  由于这是敲了很多次的代码,没有加太多注释,请谅解!

二、Mapreduce整体的流程

  1.有一块200M的文本文件,首先将待处理的数据提交客户端;

  2.客户端会向Yarn平台提交切片信息,然后Yarn计算出所需要的maptask的数量为2;

  3.程序默认使用FileInputFormat的TextInputFormat方法将文件数据读到maptask;

  4.maptask运行业务逻辑,然后将数据通过InputOutputContext写入到环形缓冲区;

  5.环形缓冲区其实是内存开辟的一块空间,就是内存,当环形缓冲区内数据达到默认大小100M的80%时,发生溢写;

  6.溢写出的数据会进行多次的分区排序(shuffle机制,下一个随笔详细解释);

  7.分区排序后的数据块可以选择进行Combiner合并,然后写入本地磁盘;

  8.reducetask等maptask完全运行完毕后,开始从磁盘中读取maptask产出写出的数据,然后进行合并文件,归并排序(这时就是进行上面辅助排序的时候);

  9.Reducer一次读取一组数据,然后使用默认的TextOutputFormat方法将数据写出到结果文件。

辅助排序和Mapreduce整体流程的更多相关文章

  1. hadoop MapReduce辅助排序解析

    1.数据样本,w1.csv到w5.csv,每个文件数据样本2000条,第一列是年份从1990到2000随机,第二列数据从1-100随机,本例辅助排序目标是找出每年最大值,实际上结果每年最大就是100, ...

  2. Hadoop案例(八)辅助排序和二次排序案例(GroupingComparator)

    辅助排序和二次排序案例(GroupingComparator) 1.需求 有如下订单数据 订单id 商品id 成交金额 0000001 Pdt_01 222.8 0000001 Pdt_05 25.8 ...

  3. (转)linux内存源码分析 - 内存回收(整体流程)

    http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时 ...

  4. MapReduce-排序(全部排序、辅助排序)

    排序 排序是MapReduce的核心技术. 1.准备 示例:按照气温字段对天气数据集排序.由于气温字段是有符号的整数,所以不能将该字段视为Text对象并以字典顺序排序.反之,用顺序文件存储数据,其In ...

  5. MapReduce基本流程与设计思想初步

    1.MapReduce是什么? MapReduce是一种编程模型,用于大规模数据集的并行运算.它借用了函数式的编程概念,是Google发明的一种数据处理模型. 主要思想为:Map(映射)和Reduce ...

  6. 2.25-2.26 MapReduce执行流程Shuffle讲解

    原文链接:https://langyu.iteye.com/blog/992916 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是 ...

  7. MapReduce工作流程及Shuffle原理概述

    引言: 虽然MapReduce计算框架简化了分布式程序设计,将所有的并行程序均需要关注的设计细节抽象成公共模块并交由系统实现,用户只需关注自己的应用程序的逻辑实现,提高了开发效率,但是开发如果对Map ...

  8. 使用git整体流程

    一.git提交代码走meger请求的整体流程 工作中使用git推代码时,如果走merge请求,那么也就是说拉代码时拉公共代码库的代码,但是提交时需要先提交到自己的代码库,然后在gitlab上提交mer ...

  9. Mybatis技术原理理——整体流程理解

    前言:2018年,是最杂乱的一年!所以你看我的博客,是不是很空! 网上有很多关于Mybatis原理介绍的博文,这里介绍两篇我个人很推荐的博文 Mybatis3.4.x技术内幕和 MyBaits源码分析 ...

随机推荐

  1. Linux(Ubuntu)换apt-get源

    在虚拟机安装完Ubuntu后,因为apt-get命令默认的服务器在国外会很慢,换成国内的会快很多 选一个国内镜像源,以清华大学开源镜像为例,要选对应的Ubuntu版本 网站链接https://mirr ...

  2. Python--Linux上安装Python

    Linux 上安装 Python 官网下载:https://www.python.org/downloads/ 本文安装包下载链接:https://pan.baidu.com/s/1uL2JyoY_g ...

  3. java jdbc ResultSet结果通过java反射赋值给java对象

    在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...

  4. RQY大佬一晚报告总结

    首先基础真的很重要.今天所有学的东西,都是为明天做铺垫,(这样看好像每天都是基础)基础牢了,学东西也就一看就会的感觉吧. 其次,自学能力很重要,投入很重要.大佬说他自己也不是看一遍书就懂的,而是反复看 ...

  5. 洛谷P3369 普通平衡树

    刚学平衡树,分别用了Splay和fhq-treap交了一遍. 这是Splay的板子,貌似比较短? Splay #include <iostream> #include <cstdio ...

  6. mybatis的if判断integer

    昨天在使用mybatis的if判断integer时遇见一个小问题: <if test="isChoose != null and isChoose != '' and isChoose ...

  7. 第七节:Trigger(SimpleTrigger、CronTrigger)哑火(MisFire)策略 :

    一. 简介 1. 什么是哑火 由于某些原因导致触发器(trigger)在该触发的时候没有得到触发,后续对应的解决策略即为哑火策略.(个人理解) 2. 哑火触发的条件 ①:所有的工作线程都在忙碌,导致某 ...

  8. 第四节:框架前期准备篇之进程外Session的两种配置方式

    一. 基本介绍 1. 背景:Asp.Net默认的Session机制是进程内,存储在服务器端内存中,有这么几个缺点: ①:既然存在内存中,空间有限,不能存储大数据量信息,数据量多的话Session会被挤 ...

  9. UML建工工具

    本篇博文简单介绍一下自己在搜索UML建模工具的过程中收集到的一些信息. 如果想用中文的,可以考虑楚凡科技的Trufun Plato,不过最近好像没有怎么更新了. 很多前辈以前用的是Rational R ...

  10. sublime text3格式化html,css,js代码

    需要安装HTML/CSS/JS prettify插件. 安装步骤:首选项 -> Package Control -> Install Package -> HTML-CSS-JS P ...