hadoop mapreduce求解有序TopN(高效模式)
1、在map阶段对数据先求解改分片的topN,到reduce阶段再合并求解一次,求解过程利用TreeMap的排序特性,不用自己写算法。
2、样板数据,类似如下
1 13682846555 192.168.100.12 www.qq.com 1938 2910 200
3、code
3.1 mapper
public class TopNMapper extends Mapper<LongWritable, Text, FlowBeanSorted,Text> {
// 定义一个TreeMap作为存储数据的容器(天然按key排序)
private TreeMap<FlowBeanSorted, Text> flowMap = new TreeMap<>();
private enum Counters {LINES}
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
context.getCounter(Counters.LINES).increment(1);
String lines = value.toString();
String[] fields = lines.split("\\s+");
String phoneNumber = fields[1];
long upFlow = Long.parseLong(fields[fields.length-3]);
long downFlow = Long.parseLong(fields[fields.length-2]);
FlowBeanSorted k = new FlowBeanSorted();
Text v = new Text();
k.setAll(upFlow,downFlow);
v.set(phoneNumber);
flowMap.put(k,v);
//限制TreeMap的数据量,超过10条就删除掉流量最小的一条数据
if (flowMap.size() > 10) {
// flowMap.remove(flowMap.firstKey());
flowMap.remove(flowMap.lastKey());
}
}
@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
Iterator<FlowBeanSorted> bean = flowMap.keySet().iterator();
while (bean.hasNext()) {
FlowBeanSorted k = bean.next();
context.write(k, flowMap.get(k));
}
}
}
3.2 reducer
public class TopNReducer extends Reducer<FlowBeanSorted, Text,Text,FlowBeanSorted> {
// 定义一个TreeMap作为存储数据的容器(天然按key排序)
TreeMap<FlowBeanSorted, Text> flowMap = new TreeMap<>();
@Override
protected void reduce(FlowBeanSorted key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for (Text value : values) {
FlowBeanSorted bean = new FlowBeanSorted();
bean.setAll(key.getUpFlow(),key.getDownFlow());
// 1 向treeMap集合中添加数据
flowMap.put(bean, new Text(value));
// 2 限制TreeMap数据量,超过10条就删除掉流量最小的一条数据
if (flowMap.size() > 10) {
// flowMap.remove(flowMap.firstKey());
flowMap.remove(flowMap.lastKey());
}
}
}
@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
// 遍历集合,输出数据
Iterator<FlowBeanSorted> it = flowMap.keySet().iterator();
while (it.hasNext()) {
FlowBeanSorted v = it.next();
context.write(new Text(flowMap.get(v)), v);
}
}
}
3.3 driver
public class TopNDriver {
public static void main(String[] args) throws Exception {
args = new String[]{"input/phone*.txt","output/"};
//获取配置信息,或者job对象实例
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration);
//指定本程序的jar包所在的本地路径
job.setJarByClass(TopNDriver.class);
//指定本业务job要使用的mapper/Reducer业务类
job.setMapperClass(TopNMapper.class);
job.setReducerClass(TopNReducer.class);
//指定mapper输出数据的kv类型
job.setMapOutputKeyClass(FlowBeanSorted.class);
job.setMapOutputValueClass(Text.class);
//指定最终输出的数据的kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(FlowBeanSorted.class);
//指定job的输入原始文件所在目录
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
Path outPath = new Path(args[1]);
FileSystem fs = FileSystem.get(configuration);
if(fs.exists(outPath)){
fs.delete(outPath,true);
}
//将job中配置的相关参数,以及job所用的java类所在的jar包, 提交给yarn去运行
boolean result = job.waitForCompletion(true);
System.exit(result ? 0 : 1);
}
}
hadoop mapreduce求解有序TopN(高效模式)的更多相关文章
- hadoop mapreduce求解有序TopN
利用hadoop的map和reduce排序特性实现对数据排序取TopN条数据. 代码参考:https://github.com/asker124143222/wordcount 1.样本数据,假设是订 ...
- Hadoop之MapReduce的两种任务模式
http://qianshangding.iteye.com/blog/2259421 Hadoop之MapReduce的两种任务模式
- Hadoop Mapreduce分区、分组、二次排序过程详解[转]
原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2) ...
- hadoop MapReduce 笔记
1. MapReduce程序开发步骤 编写map 和 reduce 程序–> 单元测试 -> 编写驱动程序进行验证-> 本地数据集调试 -> 部署到集群运行 用 ...
- hadoop MapReduce Yarn运行机制
原 Hadoop MapReduce 框架的问题 原hadoop的MapReduce框架图 从上图中可以清楚的看出原 MapReduce 程序的流程及设计思路: 首先用户程序 (JobClient) ...
- Hadoop MapReduce例子-新版API多表连接Join之模仿订单配货
文章为作者原创,未经许可,禁止转载. -Sun Yat-sen University 冯兴伟 一. 项目简介: 电子商务的发展以及电商平台的多样化,类似于京东和天猫这种拥有过亿用户的在线购 ...
- 使用Python实现Hadoop MapReduce程序
转自:使用Python实现Hadoop MapReduce程序 英文原文:Writing an Hadoop MapReduce Program in Python 根据上面两篇文章,下面是我在自己的 ...
- 四种方案:将OpenStack私有云部署到Hadoop MapReduce环境中
摘要:OpenStack与Hadoop被誉为继Linux之后最有可能获得巨大成功的开源项目.这二者如何结合成为更猛的新方案?业内给出两种答案:Hadoop跑在OpenStack上或OpenStack部 ...
- Hadoop MapReduce开发最佳实践(上篇)
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
随机推荐
- Winform中在使用VS+svn进行协同开发时添加引用时的相对路径和绝对路径的问题
场景 使用Visual Studio 开发Winform程序,使用SVN进行项目版本管理. 在添加引用时,会出现在A电脑中添加了绝对路径的引用,在B电脑中就会出现找不到 并且将此引用标识为?的状态. ...
- Implement Dependent Reference Properties 实现从属引用属性 (XPO)
In this lesson, you will learn how to implement properties whose values can depend on other properti ...
- Vue Cli3 中别名的配置问题
Vue Cli3 中别名的配置问题 vue-cli3中是没有config.build等目录的,这是因为vue-cli3中将这些配置隐藏起来了,如果想要修改,可以在vue.config.js文件中进行修 ...
- bay——linux6.5-PV-LV-VG扩容.txt
[root@rac2 cdrom]# export LANG=en_US[root@rac2 cdrom]# lsblk[root@rac2 cdrom]# lvscan --- 查看系统PV LV ...
- 北京地区dns
为了提高网页的访问打开速度我们可以配置一些解析速度较快的dns,下面小编搜集了一些常用的DNS地址,可以根据自己所在地区可以选择不同的dns 首先可以在我们的客户端打开cmd命令行工具测试一些,去pi ...
- Linux系统学习 一、安装,调试
环境 主机: Windows 10 虚拟机: VMware 15 Pro 镜像: 一.安装过程: 然后开启虚拟机 设置主机名 时区 密码 最小安装 等着 重启 登录 二.配置静态IP地址 输入ifco ...
- githup常用备份
https://github.com/ https://github.com/doumeki/ThrExcel https://github.com/xinxi1990/MyMonkey https: ...
- 记录python上传文件的坑(1)
import random import string import requests from requests_toolbelt import MultipartEncoder f = '2019 ...
- 纯CSS实现自动轮播,CSS变量的定义与使用,计算属性的使用
先来看一下实现的效果: 实现原理: HTML中使用ul>li存放图片 CSS使用CSS3的animation来完成动画 <!-- HTML --> <section class ...
- 开发工具IntelliJ IDEA
开发工具概述 IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量.它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中, ...