一、排序

排序:

需求:根据用户每月使用的流量按照使用的流量多少排序

接口-->WritableCompareable

    排序操作在hadoop中属于默认的行为。默认按照字典殊勋排序。

排序的分类:

    1)部分排序

    2)全排序

    3)辅助排序

    4)二次排序

Combiner 合并

    父类Reducer
局部汇总 ,减少网络传输量 ,进而优化程序。 注意:求平均值? 3 5 7 2 6 mapper: (3 + 5 + 7)/3 = 5
(2 + 6)/2 = 4 reducer:(5+4)/2 只能应用在不影响最终业务逻辑的情况下

二、分区和排序实例

1.Mapper类

package com.css.flowsort;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class FlowSortMapper extends Mapper<LongWritable, Text, FlowBean, Text>{ @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 1.获取一行数据
String line = value.toString();
// 2.切割
String[] fields = line.split("\t");
// 3.取出关键字段
long upFlow = Long.parseLong(fields[1]);
long dfFlow = Long.parseLong(fields[2]);
// 4.写出到reducer阶段
context.write(new FlowBean(upFlow, dfFlow), new Text(fields[0]));
}
}

2.Reducer类

package com.css.flowsort;

import java.io.IOException;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class FlowSortReducer extends Reducer<FlowBean, Text, Text, FlowBean>{ @Override
protected void reduce(FlowBean key, Iterable<Text> value, Context context)
throws IOException, InterruptedException {
context.write(value.iterator().next(), key);
}
}

3.封装类

package com.css.flowsort;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.WritableComparable; // 封装类 直接完成排序
public class FlowBean implements WritableComparable<FlowBean> { // 定义属性
private long upFlow;
private long dfFlow;
private long flowSum; // 无参构造
public FlowBean() {
} // 有参构造
public FlowBean(long upFlow,long dfFlow){
this.upFlow = upFlow;
this.dfFlow = dfFlow;
this.flowSum = upFlow + dfFlow;
} public long getUpFlow() {
return upFlow;
} public void setUpFlow(long upFlow) {
this.upFlow = upFlow;
} public long getDfFlow() {
return dfFlow;
} public void setDfFlow(long dfFlow) {
this.dfFlow = dfFlow;
} public long getFlowSum() {
return flowSum;
} public void setFlowSum(long flowSum) {
this.flowSum = flowSum;
} // 反序列化
@Override
public void readFields(DataInput in) throws IOException {
upFlow = in.readLong();
dfFlow = in.readLong();
flowSum = in.readLong();
} // 序列化
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(dfFlow);
out.writeLong(flowSum);
} @Override
public String toString() {
return upFlow + "\t" + dfFlow + "\t" + flowSum;
} // 排序
@Override
public int compareTo(FlowBean o) {
// 倒序
return this.flowSum > o.getFlowSum() ? -1 : 1;
}
}

4.自定义分区类

package com.css.flowsort;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner; public class FlowSortPartitioner extends Partitioner<FlowBean, Text>{ // 根据手机号前三位进行分区
@Override
public int getPartition(FlowBean key, Text value, int numPartitions) {
// 获取手机号前三位
String phoneNum = value.toString().substring(0, 3);
// 分区
int partitioner = 4;
if ("135".equals(phoneNum)) {
return 0;
}else if ("137".equals(phoneNum)) {
return 1;
}else if ("138".equals(phoneNum)) {
return 2;
}else if ("139".equals(phoneNum)) {
return 3;
}
return partitioner;
}
}

5.Driver类

package com.css.flowsort;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class FlowSortDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 1.获取job信息
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); // 2.获取jar包
job.setJarByClass(FlowSortDriver.class); // 3.获取自定义的mapper与reducer类
job.setMapperClass(FlowSortMapper.class);
job.setReducerClass(FlowSortReducer.class); // 4.设置map输出的数据类型
job.setMapOutputKeyClass(FlowBean.class);
job.setMapOutputValueClass(Text.class); // 5.设置reduce输出的数据类型(最终的数据类型)
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(FlowBean.class); //添加自定义分区
job.setPartitionerClass(FlowSortPartitioner.class);
job.setNumReduceTasks(5); // 6.设置输入存在的路径与处理后的结果路径
FileInputFormat.setInputPaths(job, new Path("c:/flow1024/in"));
FileOutputFormat.setOutputPath(job, new Path("c:/flow1024/out1")); // 7.提交任务
boolean rs = job.waitForCompletion(true);
System.out.println(rs ? 0 : 1);
}
}

6.输入的文件part-r-00000

13480253104    120    1320    1440
13502468823 735 11349 12084
13510439658 1116 954 2070
13560436326 1136 94 1230
13560436666 1136 94 1230
13560439658 918 4938 5856
13602846565 198 910 1108
13660577991 660 690 1350
13719199419 240 0 240
13726130503 299 681 980
13726238888 2481 24681 27162
13760778710 120 120 240
13822544101 264 0 264
13884138413 4116 1432 5548
13922314466 3008 3720 6728
13925057413 11058 4243 15301
13926251106 240 0 240
13926435656 132 1512 1644
15013685858 369 338 707
15889002119 938 380 1318
15920133257 316 296 612
18212575961 1527 2106 3633
18320173382 9531 212 9743

7.如果第5步Driver类中的红色部分去掉,则输出全局排序后的文件part-r-00000

13726238888    2481    24681    27162
13925057413 11058 4243 15301
13502468823 735 11349 12084
18320173382 9531 212 9743
13922314466 3008 3720 6728
13560439658 918 4938 5856
13884138413 4116 1432 5548
18212575961 1527 2106 3633
13510439658 1116 954 2070
13926435656 132 1512 1644
13480253104 120 1320 1440
13660577991 660 690 1350
15889002119 938 380 1318
13560436326 1136 94 1230
13560436666 1136 94 1230
13602846565 198 910 1108
13726130503 299 681 980
15013685858 369 338 707
15920133257 316 296 612
13822544101 264 0 264
13760778710 120 120 240
13719199419 240 0 240
13926251106 240 0 240

8.如果第5步Driver类中的红色部分不去掉,则输出分区加排序后的文件

(1)part-r-00000
13502468823 735 11349 12084
13560439658 918 4938 5856
13510439658 1116 954 2070
13560436666 1136 94 1230
13560436326 1136 94 1230 (2)part-r-00001
13726238888 2481 24681 27162
13726130503 299 681 980
13760778710 120 120 240
13719199419 240 0 240 (3)part-r-00002
13884138413 4116 1432 5548
13822544101 264 0 264 (4)part-r-00003
13925057413 11058 4243 15301
13922314466 3008 3720 6728
13926435656 132 1512 1644
13926251106 240 0 240 (5)part-r-00004
18320173382 9531 212 9743
18212575961 1527 2106 3633
13480253104 120 1320 1440
13660577991 660 690 1350
15889002119 938 380 1318
13602846565 198 910 1108
15013685858 369 338 707
15920133257 316 296 612

MapReduce分区和排序的更多相关文章

  1. Hadoop Mapreduce分区、分组、二次排序过程详解[转]

    原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动   (1)最简单的过程:  map - reduce   (2) ...

  2. Hadoop Mapreduce分区、分组、二次排序

    1.MapReduce中数据流动   (1)最简单的过程:  map - reduce   (2)定制了partitioner以将map的结果送往指定reducer的过程: map - partiti ...

  3. Hadoop Mapreduce分区、分组、二次排序过程详解

    转载:http://blog.tianya.cn/m/post.jsp?postId=53271442 1.MapReduce中数据流动 (1)最简单的过程:  map - reduce (2)定制了 ...

  4. Hadoop学习笔记—11.MapReduce中的排序和分组

    一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...

  5. (转)MapReduce二次排序

    一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求 ...

  6. mapreduce二次排序详解

    什么是二次排序 待排序的数据具有多个字段,首先对第一个字段排序,再对第一字段相同的行按照第二字段排序,第二次排序不破坏第一次排序的结果,这个过程就称为二次排序. 如何在mapreduce中实现二次排序 ...

  7. 详细讲解MapReduce二次排序过程

    我在15年处理大数据的时候还都是使用MapReduce, 随着时间的推移, 计算工具的发展, 内存越来越便宜, 计算方式也有了极大的改变. 到现在再做大数据开发的好多同学都是直接使用spark, hi ...

  8. Hadoop【MR的分区、排序、分组】

    [toc] 一.分区 问题:按照条件将结果输出到不同文件中 自定义分区步骤 1.自定义继承Partitioner类,重写getPartition()方法 2.在job驱动Driver中设置自定义的Pa ...

  9. Hadoop学习笔记: MapReduce二次排序

    本文给出一个实现MapReduce二次排序的例子 package SortTest; import java.io.DataInput; import java.io.DataOutput; impo ...

随机推荐

  1. 一款基于HTML5 Canvas的画板涂鸦动画

    今天给各网友分享一款基于HTML5 Canvas的画板涂鸦动画.记得之前我们分享过一款HTML5 Canvas画板工具,可以切换不同的笔刷,功能十分强大.本文今天要再来分享一款基于HTML5 Canv ...

  2. 转:Linux下which、whereis、locate、find 命令的区别

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.这些是从网上找到的资料,因为有时很长时间不会用到,当要用的时候经常弄混了,所以放到这里方便使用. which    ...

  3. am335x 一个按键实现重置 ip 和 root passwd

    * 其实做法很简单,我连按键驱动都没有去写,读取 gpio 的值然后 拷贝了一份 /etc/network/interfaces_bak 为 interfaces ,用脚本重新设置了一次root 密码 ...

  4. HashMap原理<转>

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  5. PHP——面向对象

    <body> <?php //类调用用:: //对象调用用-> class Dog1//定义类 { //成员属性(变量) var $name; var $age; var $p ...

  6. 百度JS模板引擎

    1. 应用场景 前端使用的模板系统  或  后端Javascript环境发布页面 2. 功能描述 提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同 ...

  7. Repeater DataTable 折叠动态加载

    网上关于Repeater折叠一般都是直接绑定上去,然后设置样式隐藏显示,可是这样是不太合理的,应该是客户需要的时候,你才去加载出来.所以,自己研究了一段时间,总结出下面的实现方案 首先是控件部分 &l ...

  8. keepalived管理LVS文件详解

    #全局设置,只设置一个 全局路由就可以,全局路由不能重复唯一标识. global_defs { router_id LVS_01 #全局路由ID,唯一不能重复 } #实例 vrrp_instance ...

  9. 扩展KMP - HDU 4333 Revolving Digits

    Revolving Digits Problem's Link Mean: 给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于.等于.大于原串. ...

  10. npoi导出excel_asp.net MVC

    下载路径: http://files.cnblogs.com/files/gaocong/npoi_for_mysql_mvc.rar