这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的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的更多相关文章

  1. hadoop mapreduce实现数据去重

    实现原理分析: map函数数将输入的文本按照行读取,   并将Key--每一行的内容   输出    value--空. reduce  会自动统计所有的key,我们让reduce输出key-> ...

  2. hadoop —— MapReduce例子 (数据去重)

    参考:http://eric-gcm.iteye.com/blog/1807468 例子1: 概要:数据去重 描述:将file1.txt.file2.txt中的数据合并到一个文件中的同时去掉重复的内容 ...

  3. Hadoop 数据去重

    数据去重这个实例主要是为了读者掌握并利用并行化思想对数据进行有意义的筛选.统计大数据集上的数据种类个数.从网站日志中计算访问等这些看似庞杂的任务都会涉及数据去重.下面就进入这个实例的MapReduce ...

  4. MapReduce实例(数据去重)

    数据去重: 原理(理解):Mapreduce程序首先应该确认<k3,v3>,根据<k3,v3>确定<k2,v2>,原始数据中出现次数超过一次的数据在输出文件中只出现 ...

  5. 利用MapReduce实现数据去重

    数据去重主要是为了利用并行化的思想对数据进行有意义的筛选. 统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重. 示例文件内容: 此处应有示例文件 设计思路 数据 ...

  6. Hadoop大数据平台入门——HDFS和MapReduce

    随着硬件水平的不断提高,需要处理数据的大小也越来越大.大家都知道,现在大数据有多火爆,都认为21世纪是大数据的世纪.当然我也想打上时代的便车.所以今天来学习一下大数据存储和处理. 随着数据的不断变大, ...

  7. 大数据学习笔记之Hadoop(三):MapReduce&YARN

    文章目录 一 MapReduce概念 1.1 为什么要MapReduce 1.2 MapReduce核心思想 1.3 MapReduce进程 1.4 MapReduce编程规范(八股文) 1.5 Ma ...

  8. map/reduce实现数据去重

    import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.co ...

  9. 大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图

    http://edu.51cto.com/roadmap/view/id-29.html http://my.oschina.net/infiniteSpace/blog/308401 大数据实时计算 ...

随机推荐

  1. C++ std::list

    std::list template < class T, class Alloc = allocator > class list; List Lists are sequence co ...

  2. php缓冲区详解

    什么是缓冲区(buffer)? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料. 其实缓冲区最 ...

  3. 与大家分享robotium一个小问题。Test run failed:Instrumentation run failed due to 'java.lang.ClassNotFoundException'

    今天和大家分享robotium一个小问题. 我们在运行自已经搭好的框架时,有可能会出现一个找不到类的错误(如上图所示). 问题是重签名工具给出的activity有误,这时我们可以用Appt命令查看重签 ...

  4. 【Win 10应用开发】在RichEditBox中使用自定义菜单

    前面给大伙儿简单介绍了RichEditBox控件的基本用法,以及解决其中的一些小问题. 本文咱们来看看如何自定义RichEditBox控件的上下文菜单. 原理比较简单,所以先说一说原理.当RichEd ...

  5. 前端学PHP之MemCache

    × 目录 [1]作用 [2]安装 [3]管理[4]命令 前面的话 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括 ...

  6. 多项目并行开发如何做到快速切换——sublime Text3

    sublime text有一个很人性化的功能,就是打开窗口的时候,它会把上一次关闭时的编辑器工作区状态完全复原(不论文件是否已经保存). 只有一个项目的时候,这个功能非常方便,可以保证重启电脑后cod ...

  7. Zip 压缩和解压技术在 HTML5 中的应用

    JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这 ...

  8. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  9. MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)

    最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题.这里写一篇文章,总结一下这几类问题,以及其对应的解决方案.方便其它项目组参考.   常见问题一:打开页面非常慢,有 ...

  10. Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

    简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...