本来只是想拿搜狗的数据练练手的,却无意踏足MR的topK问题。经过几番波折,虽然现在看起来很简单,但是摸爬滚打中也学到了不少


数据是搜狗实验室下的搜索日志,格式大概为:

 00:00:00    2982199073774412    [360安全卫士]    8 3    download.it.com.cn/softweb/software/firewall/antivirus/20067/17938.html
00:00:00 07594220010824798 [哄抢救灾物资] 1 1 news.21cn.com/social/daqian/2008/05/29/4777194_1.shtml
00:00:00 5228056822071097 [75810部队] 14 5 www.greatoo.com/greatoo_cn/list.asp?link_id=276&title=%BE%DE%C2%D6%D0%C2%CE%C5
00:00:00 6140463203615646 [绳艺] 62 36 www.jd-cd.com/jd_opus/xx/200607/706.html
00:00:00 8561366108033201 [汶川地震原因] 3 2 www.big38.net/
00:00:00 23908140386148713 [莫衷一是的意思] 1 2 www.chinabaike.com/article/81/82/110/2007/2007020724490.html
00:00:00 1797943298449139 [星梦缘全集在线观看] 8 5 www.6wei.net/dianshiju/????\xa1\xe9|????do=index
00:00:00 00717725924582846 [闪字吧] 1 2 www.shanziba.com/

我只是要搜索词,其他的不管,然后通过MR计算出搜索量最高的前N个词(N自定义)

整体项目结构为:


先来个类处理根据日志格式拿出搜索词

SEA.java

 package org.admln.topK;

 /**
* @author admln
*
*/
public class SEA { private String seaWord; private boolean isValid; public static SEA parser(String line) {
SEA sea = new SEA();
String str = line.split("\t")[2];
if(str.length()<3) {
sea.setValid(false);
}else {
sea.setValid(true);
sea.setSeaWord(str.substring(1, str.length()-1));
}
return sea;
} public String getSeaWord() {
return seaWord;
} public void setSeaWord(String seaWord) {
this.seaWord = seaWord;
} public boolean isValid() {
return isValid;
} public void setValid(boolean isValid) {
this.isValid = isValid;
} }

然后就是MR

 package org.admln.topK;

 import java.io.IOException;
import java.util.Collections;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /**
* @author admln
*
*/
public class TopK { public static class topKMapper extends
Mapper<Object, Text, Text, IntWritable> {
Text word = new Text();
IntWritable ONE = new IntWritable(1); @Override
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
SEA sea = SEA.parser(value.toString());
if (sea.isValid()) {
word.set(sea.getSeaWord());
context.write(word, ONE);
}
}
} public static class topKReducer extends
Reducer<Text, IntWritable, Text, IntWritable> {
int sum;
int max;
private static TreeMap<Integer,String> tree = new TreeMap<Integer,String>(Collections.reverseOrder()); public void reduce(Text key, Iterable<IntWritable> values,
Context context) {
sum = 0;
max = context.getConfiguration().getInt("topK", 10);
for (IntWritable val : values) {
sum += val.get();
}
tree.put(Integer.valueOf(sum), key.toString());
if (tree.size() > max) {
tree.remove(tree.lastKey());
} } @Override
protected void cleanup(Context context) throws IOException, InterruptedException {
Set<Entry<Integer, String>> set = tree.entrySet();
for (Entry<Integer, String> entry : set) {
context.write(new Text(entry.getValue()), new IntWritable(entry.getKey()));
}
}
} public static void main(String[] args) throws Exception {
Path input = new Path("hdfs://hadoop:8020/input/topK/");
Path output = new Path("hdfs://hadoop:8020/output/topK/"); Configuration conf = new Configuration(); conf.setInt("topK", Integer.valueOf(args[1])); Job job = new Job(conf, "topK"); job.setJarByClass(TopK.class); job.setMapperClass(topKMapper.class);
job.setReducerClass(topKReducer.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, input);
FileOutputFormat.setOutputPath(job, output); System.exit(job.waitForCompletion(true) ? 0 : 1); } }

然后上传数据(注意文件格式要从gb2312改成utf-8的。因为hadoop全部是utf-8编码的。如果不转码最后结果中文就是乱码)

本机调试或者上传到hadoop上运行

机器环境是centos6.4、hadoop是2.2.0、JDK是1.7

运行结果:


重要知识点:

  1.TreeMap,虽然是Java的知识,还是普及了一下;

  2.cleanup,这个复写API的执行时间要知道。


源码:http://pan.baidu.com/s/1i3y0rwL


InAction-MR的topK的更多相关文章

  1. MapReduce实现TopK的示例

    由于开始学习MapReduce编程已经有一段时间了,作为一个从编程中寻找自信和乐趣以及热爱编程的孩子来讲,手开始变得很“痒”了,很想小试一下身手.于是自己编写了TopK的代码.TopK的意思就是从原文 ...

  2. 基于MR实现ngram语言模型

    在大数据的今天,世界上任何一台单机都无法处理大数据,无论cpu的计算能力或者内存的容量.必须采用分布式来实现多台单机的资源整合,来进行任务的处理,包括离线的批处理和在线的实时处理. 鉴于上次开会讲了语 ...

  3. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  4. VR ( Virtual Reality )、AR(Augmented Reality)、MR(Mix Reality)和CR(Cinematic Reality)是什么鬼?

    整个社会对虚拟现实的研究和开发源于上个世纪六十年代,计算机图形学.人机接口技术.图像处理与模式识别.多传感技术.语音处理与音响技术.高性能计算机系统.人工智能等领域在之后半个世纪取得了长足的发展为虚拟 ...

  5. VR、AR、MR的区别

    VR.AR.MR定义: 什么是虚拟现实? 虚拟现实(Virtual Reality,简称VR,又译作灵境.幻真)是近年来出现的高新技术,也称灵境技术或人工环境.虚拟现实是利用电脑模拟产生一个三维空间的 ...

  6. MR操作

    MR操作————Map.Partitioner.Shuffle.Combiners.Reduce 1.Map步骤 1.1 读取输入文件,解析成k-v对,其中每个k-v对调用一次map函数 1.2 写自 ...

  7. Hadoop中MR程序的几种提交运行模式

    本地模型运行 1:在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行       ----输入输出数据可以放在本地路径下(c:/wc ...

  8. hadoop修改MR的提交的代码程序的副本数

    hadoop修改MR的提交的代码程序的副本数 Under-Replicated Blocks的数量很多,有7万多个.hadoop fsck -blocks 检查发现有很多replica missing ...

  9. MR跑百分27不动引发的问题

    今天跑MR跑到百分27就卡住不懂,查看JOB history也没看到MR,日志也没看到异常.50030端口页面不知道为什么打不开.由于MR里面设计Hbase就去查了下hbase的表.发现hbase l ...

随机推荐

  1. 随手记录一个 firefox的backgroundPostion-x和-y的问题

    今天帮大师写了一天项目,后来在测试一个显示升序和降序的标签上面,我使用了一个backgroundPosition-y来判断当前icon的状态,却无法不管是使用闭包还是个钟手段,在 firefox下面总 ...

  2. E2202 Required package 'VclJPG' not found

    xe8 [dcc32 Fatal Error] RaizeComponentsVcl_Design.dpk(40): E2202 Required package 'VclJPG' not found ...

  3. 邮件发送服务AWS SES,Mailgun以及SendCloud(转)

    原文:http://www.l4zy.com/posts/aws_ses-mailgun-sendcloud.html 电子邮件这一已经诞生很多年的互联网基础服务并没有随着时间的推移而慢慢消亡,实际上 ...

  4. 【转】jsp页面中jstl标签详解

    原文地址: JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实 ...

  5. 【转】MySQL索引和查询优化

    原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/09/26/2704344.html 对于任何DBMS,索引都是进行优化的最主要的因素.对于少 ...

  6. Axis2在Web项目中整合Spring

    一.说明: 上一篇说了Axis2与Web项目的整合(详情 :Axis2与Web项目整合)过程,如果说在Web项目中使用了Spring框架,那么又改如何进行Axis2相关的配置操作呢? 二.Axis2 ...

  7. static和extern的区别

    extern(外部) 1.对函数      完整的定义一个外部函数(可以省略extern)      完整的声明一个外部函数(可以省略extern) 2.对变量      只能声明一个外部变量(不能省 ...

  8. jsp转发action的问题找不到acton

    -----------------------------jsp转发action的问题找不到acton------------------------------------------- jsp: ...

  9. TextView 实现复制文本功能

    Android api 11 以后可以直接设置 android:textIsSelectable="true" <TextView android:layout_width= ...

  10. Codeforces Round #244 (Div. 2) B. Prison Transfer 线段树rmq

    B. Prison Transfer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...