[Hadoop]-从数据去重认识MapReduce
这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了。看了官网的教程【吐槽一下,果然英语还是很重要!】,嗯啊,一知半解地搭建了本地和伪分布式的,然后是在没弄懂,求助了Google,搞来了一台机子,嗯,搭了个分布式的。其实是作业要求啦,觉得自己平时用单机的完全够了啦~
然后被要求去做个WordCount和数据去重的小例子,嗯啊,我就抱着半桶水的Java知识就出发走向“大数据“【其实很小】了。
立马求助官网【官网就是好,虽然看的慢,英语技术两不误!】,看了给出来的WordCount的例子,自己就写了一下数据去重的小例子,还好成功了,顺便对MapReduce了解了更多。下面说一下自己的认识和实现的思路。
首先整个的流程大致是这样的

1.输入数据InputData在被Map()处理之前会先由InputFormat调用getRecordReader()生成RecordReader,RecordReader再调用creatKey()和creatValue()生成可供Map使用的<key,value>对。其中有很多格式可继承于InputFormat,如我们最常用TextInputFor就是继承于FileInputFormat,将每一行数据都生成一个记录。
2.到Map呢就是发挥数据价值的时候了。想想这些数据都能拿来干嘛,想干嘛,再coding你想要做的一切一切吧。
3.Map输出的<key,value>对在被送到Reduce之前呢,会被先送到Shuffle处理一下成为<key,value-list>的样子,Reduce最喜欢这样的了。怎么变成这样呢?嗯,就是将相同的Key数据合并在一起了,还可以指定Job.setCombinerClass(class)来指定组合的方式。还有乱糟糟的Reduce也是不喜欢的,所以在它们组合之后还要再sort一下才行,如果遇到等值的数据呢,你又想自己来定怎么排序,那就指定Job.setGroupingComparaterClass(class)来‘二次排序’吧。
4.又是一个发挥想象力的过程了。也是要好好想想Reduce能帮你干什么呢,如果觉得没必要的话,我们也可以不指定Reduce的,让Map处理后的数据就直接输出好了。在Map和Reduce阶段都可以借助Counter来获得一些统计信息哦。
5.快到尾声了,记得每一种InputFormat都有一种OutputFormat和它对应的,最常用的还是Text类型的。
6.上面我们提到了Job这个东西,其实一个Job可以理解分为Map和Reduce两个过程。所以我们既可以定义Map和Reduce,也是给Job设定各种各样的配置。最简单的设置会在后面程序的注释里给出。
数据去重实现的思路:
根据上面的流程分析,既然数据是一行一行split之后再传进去Map的,而Map的输出结果是会经过Shuffle合并相同key之后再给Reduce的,那我们将Map输入的value变成Map输出的key就ok了,这里就不用管输出的value-list是什么东西了,重复的就combine了,达到需要。
这是代码的具体实现:
/*
运行环境
CentOS7
OpenJDK-1.7.0.91
Hadoop2.7.1
!单机节点测试!
*/ //导入所需的包
import java.io.IOException;
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;
import org.apache.hadoop.util.GenericOptionsParser; public class Single
{ //map将输入中的value复制到输出数据的key上,并直接输出
/*
四个参数的意思分别是:
Object:输入到Map中的key的类型
Text:输入到Map中的value的类型
Text:输出到Reduce中的key的类型
Text:输出到Reduce中的value的类型
*/
public static class Map extends Mapper<Object, Text, Text, Text>
{
//从输入中得到的每行的数据的类型
private static Text line = new Text(); //实现map函数
public void map(Object key, Text value, Context context) throws IOException, InterruptedException
{
//获取并输出每一次的处理过程
line = value;
System.out.println("The process of the Map:" + key);
context.write(line, new Text(""));
}
} //reduce将输入中的key复制到输出数据的key上,并直接输出
public static class Reduce extends Reducer<Text, Text, Text, Text>
{ //实现reduce函数
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException
{
//获取并输出每一次的处理过程
System.out.println("The process of the Reduce:" + key);
context.write(key, new Text("")); } } public static void main(String[] args) throws Exception
{ //设置配置类
Configuration conf = new Configuration(); //是从命令行里获取输入数据和输出数据的路径,所以这里要获取和判断一下
String[] pathArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if(pathArgs.length != 2)
{
System.err.println("Please set the path of <InputData> & <OutputData> in the command!");
System.exit(2);
} //Job job = new Job(conf, "Date-Single");
//照着葫芦画不出来,就Google一下解决方法
Job job = Job.getInstance();
job.setJobName("single");
job.setJarByClass(Single.class);
//设置Map、Combine和Reduce处理类
job.setMapperClass(Map.class);
job.setCombinerClass(Reduce.class);
job.setReducerClass(Reduce.class);
//设置输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//设置输入和输出目录
FileInputFormat.addInputPath(job, new Path(pathArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(pathArgs[1]));
//这里是根据是否等待job完成之后再返回结果并退出程序
System.exit(job.waitForCompletion(true) ? 0 : 1); }
}
后记:
在这个学习过程中,很多东西都是”不求甚解“,对于它们只有一些很浅显的理解,如有错误之处,劳烦告知,谢谢。
本文由AnnsShadoW发表于:http://www.cnblogs.com/annsshadow/p/5006317.html
[Hadoop]-从数据去重认识MapReduce的更多相关文章
- hadoop mapreduce实现数据去重
实现原理分析: map函数数将输入的文本按照行读取, 并将Key--每一行的内容 输出 value--空. reduce 会自动统计所有的key,我们让reduce输出key-> ...
- hadoop —— MapReduce例子 (数据去重)
参考:http://eric-gcm.iteye.com/blog/1807468 例子1: 概要:数据去重 描述:将file1.txt.file2.txt中的数据合并到一个文件中的同时去掉重复的内容 ...
- Hadoop 数据去重
数据去重这个实例主要是为了读者掌握并利用并行化思想对数据进行有意义的筛选.统计大数据集上的数据种类个数.从网站日志中计算访问等这些看似庞杂的任务都会涉及数据去重.下面就进入这个实例的MapReduce ...
- MapReduce实例(数据去重)
数据去重: 原理(理解):Mapreduce程序首先应该确认<k3,v3>,根据<k3,v3>确定<k2,v2>,原始数据中出现次数超过一次的数据在输出文件中只出现 ...
- 利用MapReduce实现数据去重
数据去重主要是为了利用并行化的思想对数据进行有意义的筛选. 统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重. 示例文件内容: 此处应有示例文件 设计思路 数据 ...
- Hadoop大数据平台入门——HDFS和MapReduce
随着硬件水平的不断提高,需要处理数据的大小也越来越大.大家都知道,现在大数据有多火爆,都认为21世纪是大数据的世纪.当然我也想打上时代的便车.所以今天来学习一下大数据存储和处理. 随着数据的不断变大, ...
- 大数据学习笔记之Hadoop(三):MapReduce&YARN
文章目录 一 MapReduce概念 1.1 为什么要MapReduce 1.2 MapReduce核心思想 1.3 MapReduce进程 1.4 MapReduce编程规范(八股文) 1.5 Ma ...
- map/reduce实现数据去重
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.co ...
- 大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图
http://edu.51cto.com/roadmap/view/id-29.html http://my.oschina.net/infiniteSpace/blog/308401 大数据实时计算 ...
随机推荐
- 【MSP是什么】MSP认证之项目群管理学习心得
学习了项目群管理后,我深受启发,在此发表下自己的一些个人感想. 项目群是指经过协调统一管理以便获取单独管理时无法取得的效益和控制的一组相互联系的项目. 项目群中的项目需要共享组织的资源, 需要进行项目 ...
- 解析大型.NET ERP系统 通用附件管理功能
大型系统具备一个通用的附件管理功能,对于单据中无法清晰表达的字段,用一个附件图片或附件文档表示是最好的方法了.比如物料清单附加一张CAD图纸,销售订单评审功能中附加客户的各种表格,通用附件功能对系统起 ...
- 代码的坏味道(13)——过多的注释(Comments)
坏味道--过多的注释(Comments) 特征 注释本身并不是坏事.但是常常有这样的情况:一段代码中出现长长的注释,而它之所以存在,是因为代码很糟糕. 问题原因 注释的作者意识到自己的代码不直观或不明 ...
- 深入理解脚本化CSS系列第二篇——查询计算样式
× 目录 [1]getComputedStyle [2]注意事项 [3]currentStyle[4]IE 前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade ...
- 前端开发:css技巧,如何设置select、radio 、 checkbox 、file这些不可直接设置的样式 。
前言: 都说程序员有三宝:人傻,钱多,死得早.博主身边的程序“猿”一大半应了这三宝,这从侧面说明了一个问题,只有理性是过不好日子的.朋友们应该把工作与生活分开,让生活变得感性,让工作变得理性,两者相提 ...
- .NET 实现并行的几种方式(二)
本随笔续接:.NET 实现并行的几种方式(一) 四.Task 3)Task.NET 4.5 中的简易方式 在上篇随笔中,两个Demo使用的是 .NET 4.0 中的方式,代码写起来略显麻烦,这不 .N ...
- Uri各个属性取值测试
asp.net代码: Uri h_uri = new Uri("http://hovertree.com/tiku/bjaf/3ntux9r9.htm?hewenqi#hewenqipl?d ...
- ABP总体介绍
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点, ...
- C++_系列自学课程_第_11_课_类型转换_《C++ Primer 第四版》
上次说了关于表达式的一些内容,说到还有一些关于数据类型转换的内容,今天我们接着八一八C++中的数据类型转换. 一.隐式类型转换 在表达式中,有些操作符可以对多种类型的操作数进行操作, 例如 + 操作符 ...
- Backbone.js 中的Model被Destroy后,不能触发success的一个原因
下面这段代码中, 当调用destroy时,backbone会通过model中的url,向服务端发起一个HTTP DELETE请求, 以删除后台数据库中的user数据. 成功后,会回调触发绑定到dest ...