这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的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. Atitit 多元化战略 适合我们发展 的核心业务attilax总结

    Atitit 多元化战略 适合我们发展 的核心业务attilax总结 1.1. 历史的大趋势,全球范围内人员的大流动1 1.2. 衣食住行1 1.3. 农村包围城市战略1 1.4. 挪开三座大山(住房 ...

  2. PDO概念 分析 练习

    PDO 翻译过来叫做数据访问抽象层 它是一个数据访问的层面,实际上是一个类,也就是说所有操作数据库的代码,都是通过这个层面完成的 该图好理解大概就是这样一种模式 现在考虑的是能不能使用同一个类,上层代 ...

  3. DBUtil数据库连接单例 —— 简单不简单

    单例大概是我最早产生明确模式意识的设计模式,因为它足够简单粗暴,目的足够明确. 单例么,就是不管怎么访问,都返回一个单一实例就好了,我最早应用在数据库的DBUtil中. public class DB ...

  4. JavaScript权威设计--事件处理介绍(简要学习笔记十七)

    1.事件相关概念 事件类型:一个用来说明发生什么类型事件的字符串 事件目标:是发生的事件或与之相关的对象. 事件处理程序(事件监听程序):是处理货响应事件的函数. 事件对象:是与特定事件相关并且包含有 ...

  5. 6.LibSVM核函数

    libsvm的核函数类型(svmtrain.c注释部分): "-t kernel_type : set type of kernel function (default 2)\n" ...

  6. require() 源码解读

    2009年,Node.js 项目诞生,所有模块一律为 CommonJS 格式. 时至今日,Node.js 的模块仓库 npmjs.com ,已经存放了15万个模块,其中绝大部分都是 CommonJS ...

  7. SQL Server-分页方式、ISNULL与COALESCE性能分析(八)

    前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解,Always to review the basics. ...

  8. linux内核调试技术之修改内核定时器来定位系统僵死问题

    1.简介 在内核调试中,会经常出现内核僵死的问题,也就是发生死循环,内核不能产生调度.导致内核失去响应.这种情况下我们可以采用修改系统内核中的系统时钟的中断来定位发生僵死的进程和函数名称.因为内核系统 ...

  9. SSRS ----环境配置,没有 ReportServer DB 怎么办?

    今天项目进入报表开发阶段,按照习惯,打开报表管理器,发现提示下面的错误: 错误:报表服务器无法打开与报表服务器数据库的连接.所有请求和处理都要求与数据库建立连接. 这是怎么回事儿呢,经过排查,发现数据 ...

  10. 本博客现已迁移到chuxiuhong.com

    欢迎大家访问,我会暂时保留这个博客的更新,实现两个博客的同步. 新博客地址: http://chuxiuhong.com