hadoop编程小技巧(1)---map端聚合
測试hadoop版本号:2.4
Map端聚合的应用场景:当我们仅仅关心全部数据中的部分数据时,而且数据能够放入内存中。
使用的优点:能够大大减小网络数据的传输量,提高效率;
一般编程思路:在Mapper的map函数中读入全部数据,然后加入到一个List(队列)中。然后在cleanup函数中对list进行处理。输出我们关系的少量数据。
实例:
在map函数中使用空格分隔每行数据。然后把每一个单词加入到一个堆栈中,在cleanup函数中输出堆栈中单词次数比較多的单词以及次数。
package fz.inmap.aggregation;
import java.io.IOException;
import java.util.ArrayList;
import java.util.PriorityQueue;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class InMapArrgegationDriver extends Configured implements Tool{
public static Logger log = LoggerFactory.getLogger(InMapArrgegationDriver.class);
/**
* @throws Exception
*
*/
public static void main(String[] args) throws Exception {
ToolRunner.run(new Configuration(), new InMapArrgegationDriver(),args);
}
@Override
public int run(String[] arg0) throws Exception {
if(arg0.length!=3){
System.err.println("Usage:\nfz.inmap.aggregation.InMapArrgegationDriver <in> <out> <maxNum>");
return -1;
}
Configuration conf = getConf();
// System.out.println(conf.get("fs.defaultFS"));
Path in = new Path(arg0[0]);
Path out= new Path(arg0[1]);
out.getFileSystem(conf).delete(out, true);
conf.set("maxResult", arg0[2]);
Job job = Job.getInstance(conf,"in map arrgegation job");
job.setJarByClass(getClass());
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setMapperClass(InMapMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// job.setOutputKeyClass(LongWritable.class);
// job.setOutputValueClass(VectorWritable.class);
job.setNumReduceTasks(0);
// System.out.println(job.getConfiguration().get("mapreduce.job.reduces"));
// System.out.println(conf.get("mapreduce.job.reduces"));
FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out);
return job.waitForCompletion(true)?0:-1;
}
protected static class InMapMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
private ArrayList<Word> words = new ArrayList<Word>();
private PriorityQueue<Word> queue;
private int maxResult;
protected void setup(Context cxt){
maxResult = cxt.getConfiguration().getInt("maxResult", 10);
}
protected void map(LongWritable key, Text value,Context cxt){
String [] line = value.toString().split(" "); // use blank to split
for(String word:line){
Word curr = new Word(word,1);
if(words.contains(curr)){
// increase the exists word's frequency
for(Word w:words){
if(w.equals(curr)){
w.frequency++;
break;
}
}
}else{
words.add(curr);
}
}
}
protected void cleanup(Context cxt) throws InterruptedException,IOException{
Text outputKey = new Text();
IntWritable outputValue = new IntWritable();
queue = new PriorityQueue<Word>(words.size());
queue.addAll(words);
for(int i=0;i< maxResult;i++){
Word tail = queue.poll();
if(tail!=null){
outputKey.set(tail.value);
outputValue.set(tail.frequency);
log.info("key is {},value is {}", outputKey,outputValue);
cxt.write(outputKey, outputValue);
}
}
}
}
}
使用到的Word类
package fz.inmap.aggregation;
public class Word implements Comparable<Word>{
public String value;
public int frequency;
public Word(String value,int frequency){
this.value=value;
this.frequency=frequency;
}
@Override
public int compareTo(Word o) {
return o.frequency-this.frequency;
}
@Override
public boolean equals(Object obj){
if(obj instanceof Word){
return value.equalsIgnoreCase(((Word)obj).value);
}else{
return false;
}
}
}
查看输出结果,能够看日志(因为在程序中输出了日志,所以在日志中也能够查看到);
或者查看输出结果:
总结:使用map端聚合,尽管能够大大减小网络传输数据量。提高效率,可是我们在应用的时候还是须要考虑实际的应用环境。比方。假设使用上面的算法来计算最大单词频率的前10个,然后还是使用上面的代码。就会有问题。
每一个mapper会处理并输出自己的单词词频最大的10个单词,并没有考虑到全部数据。这样在reducer端整合的时候就会可能会忽略部分数据,造成终于结果的错误。
分享,成长,快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990
hadoop编程小技巧(1)---map端聚合的更多相关文章
- hadoop编程小技巧(5)---自定义输入文件格式类InputFormat
Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...
- hadoop编程小技巧(5)---自己定义输入文件格式类InputFormat
Hadoop代码測试环境:Hadoop2.4 应用:在对数据须要进行一定条件的过滤和简单处理的时候能够使用自己定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForm ...
- hadoop编程小技巧(7)---自己定义输出文件格式以及输出到不同文件夹
代码測试环境:Hadoop2.4 应用场景:当须要定制输出数据格式时能够採用此技巧,包含定制输出数据的展现形式.输出路径.输出文件名称称等. Hadoop内置的输出文件格式有: 1)FileOutpu ...
- Java编程小技巧(1)——方法传回两个对象
原文地址:Java编程小技巧(1)--方法传回两个对象 | Stars-One的杂货小窝 题目是个伪命题,由Java语法我们都知道,方法要么返回一个对象,要么就不返回 当有这样的情况,我们需要返回两个 ...
- Shellcode编程小技巧
工作需要,需要注入其他程序监控一些东西,检测到的数据通过WM_COPY 消息发送给显示窗体.(大体是这样的还没定稿) ##1 选择一个框架 ## tombkeeper/Shellcode_Templa ...
- 学会这些 pycharm 编程小技巧,编程效率提升 10 倍
PyCharm 是一款非常强大的编写 python 代码的工具.掌握一些小技巧能成倍的提升写代码的效率,本篇介绍几个经常使用的小技巧. 一.分屏展示 当你想同时看到多个文件的时候: 1.右击标签页: ...
- android 编程小技巧(持续中)
first: Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为 ...
- 编程小技巧之 Linux 文本处理命令
合格的程序员都善于使用工具,正所谓君子性非异也,善假于物也.合理的利用 Linux 的命令行工具,可以提高我们的工作效率. 本文简单的介绍三个能使用 Linux 文本处理命令的场景,给大家开阔一下思路 ...
- WTL编程小技巧汇编
1.设置窗体生成大小并中央显示窗口 2.设置窗体最大/小尺寸 3.动态设置窗体标题 4.设置对话框的字体和背景颜色 5.设置窗体控件默认字体 以下技巧可应用于SDI和MDI程序: 1.设置窗体生成大小 ...
随机推荐
- 【Luogu5293】[HNOI2019] 白兔之舞
题目链接 题目描述 略 Sol 考场上暴力 \(O(L)\) 50分真良心. 简单的推一下式子,对于一个 t 来说,答案就是: \[\sum_{i=0}^{L} [k|(i-t)] {L\choose ...
- 设计模式Design Pattern(2)--单例模式
单例顾名思义就是一个实例.类只有唯一一个实例,并提供给全局使用.解决了全局使用的类频繁地创建与销毁带了的消耗. 单例模式常用简单,但细究却又不简单,且往下看. 单例模式又可以分为 (1)懒汉式:需要使 ...
- SpringCloud学习系列-微服务
最近和尚硅谷周阳老师学习了Spring Cloud感觉有必要在这里做下笔记和总结. 软件系统架构演变 单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用 ...
- 【leetcode】Decode Ways
题目如下: 解题思路:这个题目的本质是一个爬楼梯问题,在爬楼梯问题中,每次可以选择走一步或者两步.而本题也是一样的,解码的时候选择解码一个字符或者两个字符,但是加大了一点点难度,要考虑这些情况.1,Z ...
- 【bzoj3463】[COCI2012] Inspector
*题目描述: 在一个小国家中,一个新的小镇终于建成了!如往常一样,Mirko获得了“首席税务巡查员”的职位.他的任务是保证正确地计算各公司的收入情况.一共有N家办公室坐落在主干道上,从左到右被编号为1 ...
- CG-CTF | 密码重置2
跟则提示走,美滋滋: 1.找到邮箱: 2.下载备份: 3.PHP弱类型,string与int用的是“==” ........这一行是省略的代码........ if(!empty($token)&am ...
- 《SQL Server 2012 T-SQL基础》读书笔记 - 10.可编程对象
Chapter 10 Programmable Objects 声明和赋值一个变量: DECLARE @i AS INT; SET @i = 10; 变量可以让你暂时存一个值进去,然后之后再用,作用域 ...
- 谷歌 AXURE RP EXTENSION拓展问题
我们打开某种文件页面是 会提示我们下载 AXURE RP EXTENSION 拓展. 其实我们可以直接用ie浏览器打开即可,不用下载
- 在裸机centos7系统中部署django项目的过程
概要 本文用一台安装了centos7.5系统的裸奔Linux机器(当然是虚拟机)详细讲解从无到有部署django项目的过程. 安装必要的工具 配置yum源 至于什么是yum源大家请自行百度,本人用的是 ...
- mysql group by 去重 分类 求和
w SELECT COUNT(*) FROM ( SELECT COUNT(*) FROM listing_vary_asins GROUP BY asin, countrycode ) AS w; ...