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& ...
随机推荐
- (转)python中用logging实现日志滚动和过期日志删除
转自:https://blog.csdn.net/ashi198866/article/details/46725813 logging库提供了两个可以用于日志滚动的class(可以参考https:/ ...
- Web前端基础(17):jQuery基础(四)
1. jQuery的属性操作 jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如at ...
- GO语言介绍以及开发环境配置
一.介绍 GO语言是静态强类型语言 静态也就是编译型语言 二.安装 1.下载地址 下载地址 https://golang.google.cn/dl/ 2.安装 Linux安装 1.下载二进制包:go1 ...
- javaWeb核心技术第十一篇之Listener
监听器:所谓的监听器是指对整个WEB环境的监听,当被监视的对象发生改变时,立即调用相应的方法进行处理. 监听术语: 事件源:被监听的对象. 监听器对象:监听事件源的对象 注册或绑定:1和2结合的过程 ...
- 松软科技web课堂:SQLServer之MID() 函数
MID() 函数 MID 函数用于从文本字段中提取字符. SQL MID() 语法 SELECT MID(column_name,start[,length]) FROM table_name 参数 ...
- 代码审计 => 74cms_v3.5.1.20141128 一系列漏洞
0x01 前言 最近开始在学习代码审计了,以前几次学习代码审计都因为不知道如何下手,和代码的复杂就放弃了,这一次算是真正的认真学习,同时seay所编写的<代码审计 企业级Web代码安全架构> ...
- MySQL基础之练习题
题目 现有班级.学生以及成绩三张表: 备注:表名称和字段名称可以参考表格内单词设置 根据表格信息,按要求完成下面SQL语句的编写: 1.使用SQL分别创建班级表.学生表以及成绩表的表结构,表内数据可以 ...
- RHEL 6.6配置网易CentOS镜像的yum源小结
之前没有使用过网易CentOS镜像的yum源,最近由于需要,遂在一台测试服务器验证.测试了一下如何配置使用网易的Cent0S的yum源.此文仅仅是笔记性质,参考了网上大量资料(文末"参 ...
- CentOS-7-x86_64-Minimal安装后的初始设置
本文是给0基础的初始linux小白写的,只是方便大家尽快上手掌握使用linux系统,完成当前任务,有一定基础能力的请忽略 接上一篇的安装之后,开始配置linx的一些基本功能 1,第一步,也是最重要的一 ...
- Invoke 与 BeginInvoke的区别
引用文章路径:https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 区别 一直对invoke和begininvoke ...