InAction-MR的topK
本来只是想拿搜狗的数据练练手的,却无意踏足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的更多相关文章
- MapReduce实现TopK的示例
由于开始学习MapReduce编程已经有一段时间了,作为一个从编程中寻找自信和乐趣以及热爱编程的孩子来讲,手开始变得很“痒”了,很想小试一下身手.于是自己编写了TopK的代码.TopK的意思就是从原文 ...
- 基于MR实现ngram语言模型
在大数据的今天,世界上任何一台单机都无法处理大数据,无论cpu的计算能力或者内存的容量.必须采用分布式来实现多台单机的资源整合,来进行任务的处理,包括离线的批处理和在线的实时处理. 鉴于上次开会讲了语 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- VR ( Virtual Reality )、AR(Augmented Reality)、MR(Mix Reality)和CR(Cinematic Reality)是什么鬼?
整个社会对虚拟现实的研究和开发源于上个世纪六十年代,计算机图形学.人机接口技术.图像处理与模式识别.多传感技术.语音处理与音响技术.高性能计算机系统.人工智能等领域在之后半个世纪取得了长足的发展为虚拟 ...
- VR、AR、MR的区别
VR.AR.MR定义: 什么是虚拟现实? 虚拟现实(Virtual Reality,简称VR,又译作灵境.幻真)是近年来出现的高新技术,也称灵境技术或人工环境.虚拟现实是利用电脑模拟产生一个三维空间的 ...
- MR操作
MR操作————Map.Partitioner.Shuffle.Combiners.Reduce 1.Map步骤 1.1 读取输入文件,解析成k-v对,其中每个k-v对调用一次map函数 1.2 写自 ...
- Hadoop中MR程序的几种提交运行模式
本地模型运行 1:在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器localjobrunner执行 ----输入输出数据可以放在本地路径下(c:/wc ...
- hadoop修改MR的提交的代码程序的副本数
hadoop修改MR的提交的代码程序的副本数 Under-Replicated Blocks的数量很多,有7万多个.hadoop fsck -blocks 检查发现有很多replica missing ...
- MR跑百分27不动引发的问题
今天跑MR跑到百分27就卡住不懂,查看JOB history也没看到MR,日志也没看到异常.50030端口页面不知道为什么打不开.由于MR里面设计Hbase就去查了下hbase的表.发现hbase l ...
随机推荐
- html5 canvas图片马赛克
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- html5页面中拨打电话的方式
<a href="tel:18688888888">拨号</a> <a href="sms:18688888888">发短信 ...
- hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)
hdu4135 求[L,R]范围内与N互质的数的个数. 分别求[1,L]和[1,R]和n互质的个数,求差. 利用容斥原理求解. 二进制枚举每一种质数的组合,奇加偶减. #include <bit ...
- MYSQL数据库性能调优之四:解决慢查询--索引
为什么索引能够提高查询速度?没有索引 检索数据的方式是从头到尾一条一条挨着匹配,这是慢的根本原因:索引类型BTREE:二叉树类型,原理图如下:对表创建一个二叉树,记录中间数据的物理磁盘地址,二叉树检索 ...
- Linux查找文件夹名
@(编程) find / -type d -name filename type的类型 -type c File is of type c: b block (buffered) special c ...
- MFC下的各种字符串类型和相互转换
MFC下的常用字符串数据类型表示的含义: L:Long 长 P:Point 指针 C:Const 常量 W:Wchar_t 宽字符 T:TCHAR STR:String 字符串 在看看MF ...
- Odoo 开发者模式
这里我们以Odoo V9介绍下Odoo的开发者模式: 进入开发者模式: 登录odoo系统后,点击右上角登陆账号下拉菜单,选择About,然后在弹出菜单里点击Activate the developer ...
- JQery icheck 插件
<script type="text/javascript"> $(document).ready(function(){ var callbacks_list = $ ...
- typeof与GetType区别及反射的见解
http://www.cnblogs.com/knowledgesea/archive/2013/03/02/2935920.html http://www.cnblogs.com/Jax/archi ...
- perl学习笔记(4)——动态加载
在写perl的时候,如果要应用到各种平台的话,比如linux 和windows,会遇到各种问题,有时就是要根据系统类型来加载各种库,之前写的就是这样的, if($^O eq 'linux'){ use ...