`

[Hadoop] TopK的一个简单实现

 
阅读更多

题外话:

《Hadoop in Action》 是一本非常不错的交Hadoop的入门书,而且建议看英文版。此书作者的英文表达非常简单易懂。相信有一定英文阅读能力的同学直接用英文版就能非常容易的上手~

 

 

进入正题。 这个题目是《Hadoop in Action》 上面的一道题目,求出Top K的值。

我自己随便弄了一个输入文件:

g	445
a	1117
b	222
c	333
d	444
e	123
f	345
h	456

 

 

讲讲我的思路:

对于Top K的问题,首先要在每个block/分片之中找到这部分的Top K。并且由于只能输出一次,所以输出的工作需要在cleanup方法之中进行。为了简单,使用的是java之中的TreeMap,因为这个数据结构天生就带有排序功能。 而Reducer的工作流程跟Map其实是完全一致的,只是光Map一步还不够,所以只能再加一个Reduce步骤。

 

最终输出的格式为如下:(K=2)

1117    a
456    g

所以需要使用map。 如果只需要输出大小的话,直接使用TreeSet会更高效一点。

 

下面是实现的代码:

package hadoop_in_action_exersice;

import java.io.IOException;
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.LongWritable;
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;

public class TopK {

	public static final int K = 2;
	
	public static class KMap extends Mapper<LongWritable, Text, IntWritable, Text> {
		
		TreeMap<Integer, String> map = new TreeMap<Integer, String>(); 
		
		public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			
			String line = value.toString();
			if(line.trim().length() > 0 && line.indexOf("\t") != -1) {
				
				String[] arr = line.split("\t", 2);
				String name = arr[0];
				Integer num = Integer.parseInt(arr[1]);
				map.put(num, name);
				
				if(map.size() > K) {
					map.remove(map.firstKey());
				}
			}
		}

		@Override
		protected void cleanup(
				Mapper<LongWritable, Text, IntWritable, Text>.Context context)
				throws IOException, InterruptedException {
			
			for(Integer num : map.keySet()) {
				context.write(new IntWritable(num), new Text(map.get(num)));
			}
			
		}
		
	}
	
	
	public static class KReduce extends Reducer<IntWritable, Text, IntWritable, Text> {
		
		TreeMap<Integer, String> map = new TreeMap<Integer, String>();
		
		public void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
				
			map.put(key.get(), values.iterator().next().toString());
			if(map.size() > K) {
				map.remove(map.firstKey());
			}
		}

		@Override
		protected void cleanup(
				Reducer<IntWritable, Text, IntWritable, Text>.Context context)
				throws IOException, InterruptedException {
			for(Integer num : map.keySet()) {
				context.write(new IntWritable(num), new Text(map.get(num)));
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Configuration conf = new Configuration();
		try {
			Job job = new Job(conf, "my own word count");
			job.setJarByClass(TopK.class);
			job.setMapperClass(KMap.class);
			job.setCombinerClass(KReduce.class);
			job.setReducerClass(KReduce.class);
			job.setOutputKeyClass(IntWritable.class);
			job.setOutputValueClass(Text.class);
			FileInputFormat.setInputPaths(job, new Path("/home/hadoop/DataSet/Hadoop/WordCount-Result"));
			FileOutputFormat.setOutputPath(job, new Path("/home/hadoop/DataSet/Hadoop/TopK-output1"));
			System.out.println(job.waitForCompletion(true));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

 

分享到:
评论

相关推荐

    基于MapReduce方法统计服务器日志topk数据.zip

    这里我们关注的是一个使用Hadoop框架,基于MapReduce方法来统计服务器日志中的TopK数据的项目。这个项目名为"TopK-Log-Map-Reduce-master",它揭示了如何利用分布式计算技术处理海量日志数据,找出出现频率最高的前K...

    基于项目k临近的协同过滤的Hadoop实现,数据集采用MovieLens.zip

    总结来说,基于项目K临近的协同过滤在Hadoop上的实现,是对大数据时代推荐系统的一种高效解决方案。它结合了人工智能的理论与Hadoop的分布式计算能力,实现了大规模数据的快速处理,为实际应用提供了强大的支持。

    论文研究-一种基于Hadoop的高效[K]-Medoids并行算法.pdf

    以及在大数据环境下所面临的内存容量和CPU处理速度的瓶颈问题,从改进初始中心选择方案和中心替换策略入手,利用Hadoop分布式计算平台结合基于Top [K]的并行随机采样策略,实现了一种高效稳定的[K]-Medoids并行算法...

    hadoop面试题汇总1

    1. 获取前 1K 个最大数:可以使用 Top K 算法,例如使用最小堆数据结构,维护一个大小为 1K 的堆,遍历所有数据,每次遇到比堆顶元素大的数就替换堆顶并重新调整堆。 2. 爬虫设计:需要实现 URL 规则配置、深度限制...

    基于Java的Hadoop HDFS和MapReduce实践案例设计源码

    内容涵盖HDFS的JAVA API操作,如文件读取、写入、删除、元数据查询和文件列表等,以及MapReduce编程模型的多个应用,包括求平均数、Join操作、TopK算法、二次排序,并涉及自定义InputFormat、OutputFormat和shuflle...

    《数据算法Hadoop Spark大数据处理技巧》PDF 带目录!!

    目录 第1章二次排序:简介 19 第2章二次排序:详细示例 42 第3章 Top 10 列表 54 第4章左外连接 96 第5章反转排序 127 第6章移动平均 137 第7章购物篮分析 155 第8章共同好友 182 第9章使用MapReduce实现推荐引擎 ...

    大数据工作面试练习题 BAT大数据面试题 Hadoop、kafka、HDFS、Spark、MapReduce 共19页.pdf

    3. **Hadoop Shuffle过程**:在MapReduce中,Shuffle阶段是Map任务完成后,数据被分区并排序的过程,确保相同键的数据被分发到同一个Reducer。 4. **Spark集群运算模式**:Spark支持三种运算模式:本地模式(Local...

    Hadoop-Cube-MRCube

    MRCube 在这个项目中,我实现了MRCube算法,该算法在Arnab Nandi,丛瑜,Philip Bohannon,...考虑一个仓库:(城市,州,国家,日,月,年,销售) ,其中: (城市,州,国家/地区) :位置维度 (日,月,年)

    大数据开发面试集锦

    * 使用 MapReduce 实现 TopK 问题的示例:现在有 10 个文件夹,每个文件夹都有 1000000 个 URL,找出 top 1000000 URL。 10. 集群管理 * 可以使用 Puppet、Pdsh、Cloudera Manager、Zookeeper 等工具来管理 Hadoop...

    一亿取100数字Top100

    这个任务是数据处理和算法优化的一个典型场景,通常涉及到大规模数据的排序和统计。下面将详细讨论相关知识点。 首先,面对一亿个数字的数据量,我们需要考虑的是数据处理的效率。由于数据规模巨大,如果使用传统的...

    海量数据查找数据问题

    在每次划分操作中,我们选择一个枢轴元素,将小于枢轴的元素放在其左侧,大于枢轴的元素放在右侧。通过选取合适的枢轴,可以在O(n)的时间复杂度内找到第k小(大)的元素,对于找中位数,我们只需找到第(n/2)小的元素...

    搜索记录频繁模式挖掘1

    6.1 至6.4 未给出的章节可能涉及了Top K频繁模式挖掘、Reducer数量的选择以及如何处理大数据量的挑战。 7.1 至9.4 可能涵盖了实验设置、结果分析和未来研究方向。 总结,搜索记录频繁模式挖掘是通过Hadoop和...

    行业分类-设备装置-一种实时移动空间关键字近似Top-k查询方法.zip

    4. **Top-k查询**:Top-k查询是数据挖掘和数据库查询中的一个重要概念,它返回查询结果中排名前k个最重要的条目。在实时移动空间查询中,这可能意味着找出最相关的k个设备、最频繁出现的k个故障模式或者最活跃的k个...

    大数据工程师面试题

    2.7 使用 MapReduce 来实现 TopK 问题,可以使用自定义的Mapper 和 Reducer 来实现数据的处理和排序。 大数据工程师面试题涵盖了 Hadoop 相关的知识点,包括 HDFS、MapReduce、YARN 等,旨在考察应聘者的 Hadoop ...

    3_Learning Notes for Big Data.docx

    - **数据倾斜**: Hadoop作业中出现的一个常见问题是数据倾斜,即部分Reducer处理的数据量远大于其他Reducer,导致整个作业的执行效率低下。 - **解决方案**: 一种常见的解决方法是在数据进入Hadoop作业之前,对数据...

    云计算在舰船远程实时监控系统中的应用.pdf

    在实现上,文中提到了一个具体的硬件配置环境,例如使用了IBM的Hadoop集群环境,配置为5.3.20GHz的CPU和8G的内存,操作系统为Linux。利用这样的环境,可以进行大规模并行处理,满足实时监控系统的需求。 本文对于...

    春招资料,包括大数据开发和力扣

    1. **Hadoop**:Hadoop是Apache基金会的一个开源框架,用于处理和存储大量数据。它以分布式文件系统HDFS为基础,允许数据在多台服务器之间进行分布式存储和处理。Hadoop MapReduce是Hadoop的核心组件之一,用于大...

    大数据面试题,唬住50k.pdf

    - **找出Top K URL**:可以使用MapReduce实现,例如使用TreeMap保持前K个URL。 这些面试题涵盖了Hadoop的基础知识,包括架构、存储、计算模型以及实际应用,对于理解Hadoop生态系统及其工作原理至关重要。在准备...

Global site tag (gtag.js) - Google Analytics