我们继续通过项目强化掌握Combiner和Partitioner优化Hadoop性能

1、项目介绍

本项目我们使用明星搜索指数数据,分别统计出搜索指数最高的男明星和女明星。

2、数据集

3、分析

基于项目的需求,我们通过以下几步完成:

1、编写Mapper类,按需求将数据集解析为key=gender,value=name+hotIndex,然后输出。

2、编写Combiner类,合并Mapper输出结果,然后输出给Reducer。

3、编写Partitioner类,按性别,将结果指定给不同的Reduce执行。

4、编写Reducer类,分别统计出男、女明星的最高搜索指数。

5、编写run方法执行MapReduce任务

4、实现

package com.buaa;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; /**
* @ProjectName CountStarSearchIndex
* @PackageName com.buaa
* @ClassName SearchStarIndex
* @Description 统计分别统计出男女明星最大搜索指数
* @Author 刘吉超
* @Date 2016-05-12 16:30:23
*/
public class SearchStarIndex extends Configured implements Tool {
// 分隔符\t
private static String TAB_SEPARATOR = "\t";
// 男
private static String MALE = "male";
// 女
private static String FEMALE = "female"; /*
* 解析明星数据
*/
public static class IndexMapper extends Mapper<Object, Text, Text, Text> {
/*
* 每次调用map(LongWritable key, Text value, Context context)解析一行数据。
* 每行数据存储在value参数值中。然后根据'\t'分隔符,解析出明星姓名,性别和搜索指数
*/
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
// 将数据解析为数组
String[] tokens = value.toString().split(TAB_SEPARATOR); if(tokens != null && tokens.length >= 3){
// 性别
String gender = tokens[1].trim();
// 名称、关注指数
String nameHotIndex = tokens[0].trim() + TAB_SEPARATOR + tokens[2].trim(); // 输出key=gender value=name+hotIndex
context.write(new Text(gender), new Text(nameHotIndex));
}
}
} /*
* 根据性别对数据进行分区,将 Mapper的输出结果均匀分布在 reduce上
*/
public static class IndexPartitioner extends Partitioner<Text, Text> {
@Override
public int getPartition(Text key, Text value, int numReduceTasks) {
// 按性别分区
String sex = key.toString(); // 默认指定分区 0
if(numReduceTasks == 0)
return 0; // 性别为男,选择分区0
if(MALE.equals(sex)){
return 0;
}else if(FEMALE.equals(sex)){ // 性别为女,选择分区1
return 1 % numReduceTasks;
}else // 性别未知,选择分区2
return 2 % numReduceTasks; }
} /*
* 定义Combiner,对 map端的输出结果,先进行一次合并,减少数据的网络输出
*/
public static class IndexCombiner extends Reducer<Text, Text, Text, Text> { @Override
public void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException {
int maxHotIndex = Integer.MIN_VALUE;
String name= ""; for (Text val : values) {
String[] valTokens = val.toString().split(TAB_SEPARATOR); int hotIndex = Integer.parseInt(valTokens[1]); if(hotIndex > maxHotIndex){
name = valTokens[0];
maxHotIndex = hotIndex;
}
} context.write(key, new Text(name + TAB_SEPARATOR + maxHotIndex));
}
} /*
* 统计男、女明星最高搜索指数
*/
public static class IndexReducer extends Reducer<Text, Text, Text, Text> {
/*
* 调用reduce(key, Iterable< Text> values, context)方法来处理每个key和values的集合。
* 我们在values集合中,计算出明星的最大搜索指数
*/
@Override
public void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException {
int maxHotIndex = Integer.MIN_VALUE;
String name = " "; // 根据key,迭代 values集合,求出最高搜索指数
for (Text val : values) {
String[] valTokens = val.toString().split(TAB_SEPARATOR); int hotIndex = Integer.parseInt(valTokens[1]); if (hotIndex > maxHotIndex) {
name = valTokens[0];
maxHotIndex = hotIndex;
}
} context.write(new Text(name), new Text(key + TAB_SEPARATOR + maxHotIndex));
}
} @SuppressWarnings("deprecation")
@Override
public int run(String[] args) throws Exception {
// 读取配置文件
Configuration conf = new Configuration(); // 如果目标文件夹存在,则删除
Path mypath = new Path(args[1]);
FileSystem hdfs = mypath.getFileSystem(conf);
if (hdfs.isDirectory(mypath)) {
hdfs.delete(mypath, true);
} // 新建一个任务
Job job = new Job(conf, "searchStarIndex");
// 主类
job.setJarByClass(SearchStarIndex.class); // reduce的个数设置为2
job.setNumReduceTasks(2);
// 设置Partitioner类
job.setPartitionerClass(IndexPartitioner.class); // Mapper
job.setMapperClass(IndexMapper.class);
// Reducer
job.setReducerClass(IndexReducer.class); // map 输出key类型
job.setMapOutputKeyClass(Text.class);
// map 输出value类型
job.setMapOutputValueClass(Text.class); // 设置Combiner类
job.setCombinerClass(IndexCombiner.class); // 输出结果 key类型
job.setOutputKeyClass(Text.class);
// 输出结果 value类型
job.setOutputValueClass(Text.class); // 输入路径
FileInputFormat.addInputPath(job, new Path(args[0]));
// 输出路径
FileOutputFormat.setOutputPath(job, new Path(args[1])); // 提交任务
return job.waitForCompletion(true) ? 0 : 1;
} public static void main(String[] args) throws Exception {
String[] args0 = {
"hdfs://ljc:9000/buaa/index/index.txt",
"hdfs://ljc:9000/buaa/index/out/"
};
int ec = ToolRunner.run(new Configuration(), new SearchStarIndex(), args0);
System.exit(ec);
}
}

5、运行效果

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【刘超★ljc】。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

实现代码及数据:下载

MapReduce明星搜索指数统计,找出人气王的更多相关文章

  1. Hadoop实战:明星搜索指数统计,找出人气王

    项目介绍 本项目我们使用明星搜索指数数据,分别统计出搜索指数最高的男明星和女明星. 数据集 明星搜索指数数据集,如下图所示.猛戳此链接下载数据集 思路分析 基于项目的需求,我们通过以下几步完成: 1. ...

  2. MapReduce 找出共同好友

    这个前提需要注意:好友之间的关系是单向的,我的好友队列里有你,你的里面不一定有我.所以思考方式需要改变. 共同好友: 某两个人的好友队列里都有的人. 第一个mapper 和 reducer 简单说:找 ...

  3. Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离

    Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索. 把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于 ...

  4. C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

    //对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...

  5. Python list去重及找出,统计重复项

    http://bbs.chinaunix.net/thread-1680208-1-1.html 如何找出 python list 中有重复的项 http://www.cnblogs.com/feis ...

  6. [leetcode] 230. Kth Smallest Element in a BST 找出二叉搜索树中的第k小的元素

    题目大意 https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/ 230. Kth Smallest Elem ...

  7. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

    前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...

  8. 海量数据中找出前k大数(topk问题)

    海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...

  9. S关于使用QL声明 找出同时满足多个tag拍摄条件设置算法

    表结构 Tag Table:{tag_id, tag_name}  #标签表 News Table:{news_id, title,......}  #新闻列表 NewsTags Table:{tag ...

随机推荐

  1. 对c++服务端进行覆盖率统计

    (1)首先需要为每个被测程序的所有编译文件增加选项,如果文件太多,这无疑是灾难,可利用spec文件达到目的 sed -i '$ a\export LD_PRELOAD=/usr/local/bin/c ...

  2. 64位Win7下编译Python3的计算机视觉库:OpenCV

    注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) OpenCV目前最新版是3.0.0 rc1,官方给出了编译好的Python2可以直接使用 ...

  3. Linux内核监控模块-2-系统调用表地址的获取(Linux内核版本3.13)

    那么在Linux内核2.6之后,不能直接导出sys_call_table的地址后,我们要如何获得系统调用表的地址,从而实现系统调用的截获呢. 先贴上我实现好的代码,然后再来讲解吧. modu.c #i ...

  4. JS匿名执行函数

    一.匿名函数的创建 第一种:(调用sum后可执行) var sum=function(x,y){ return x+y; } 第二种:(可自执行) void function(x,y){ }(1,2) ...

  5. JavaService wrapper

    http://my.oschina.net/yjwxh/blog/260835 http://blog.chinaunix.net/uid-664509-id-3398193.html http:// ...

  6. UIImageView之我的动画为什么停了?UIImageView, highLighted,animationImages

    如果你的动画总是停了!停了!停了!不管你想不想都停,这里有个参考,你可以看看!这只是一种可能性!!! 受最近看到段子影响,画风略诡异,不喜勿喷. 最近在“刻”动画!!! 为什么是“刻”,动画写了3周啊 ...

  7. Delphi如何让程序最小化到任务栏(截取WM_SYSCOMMAND后,调用Shell_NotifyIcon)

    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标.象FoxMail 3.0 NetVampire 3.0等都提供了这样的功 ...

  8. 深入Spring之web.xml

    针对web.xml我打算从以下几点进行解析: 1.ContextLoaderListener: 启动Web容器时,自动装配ApplicationContext的配置信息. 2.RequestConte ...

  9. 坑爹的Android Ble 问题记录日志

    开发Ble(公司项目,防丢器)已经有一段时间,由于是第一次接触Ble而网上资料又不多,且android平台自身的差异性,遇到了很多问题.为了将来方便查阅,在此做下记录.1.中兴手机,蓝牙手动断开后,无 ...

  10. HTTP, W3SVC, WAS 和 W3WP

    IIS 请求主要模块        当客户端向 IIS 发出 HTTP 请求时,会有很多事情发生. 有许多内核模式和本机模式组件,用于将请求路由到最终响应请求的 W3WP 进程.       响应一个 ...