1、MapReduce编程模型

MapReduce采用分而治之的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单来说,MapReduce就是“任务的分解和结果的汇总”。

在Hadoop中,用于执行MapReduce任务的机器角色有两个:一个是JobTracker;另一个是TaskTracker。JobTracker用于调度工作的,TaskTracker是用于执行工作的。一个Hadoop集群中只有一台JobTracker。

在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。

需要注意的是,用MapReduce来处理的数据集(或任务)必须具备这样的特点:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。

2、MapReduce处理过程

在Hadoop中,每个MapReduce任务都被初始化为一个Job,每个Job又可以分为两种阶段:map阶段和reduce阶段。这两个阶段分别用两个函数表示,即map函数和reduce函数。map函数接收一个<key, value>形式的输入,然后同样产生一个<key, value>形式的中间输出,reduce函数接收一个如<key, (list of values)>形式的输入,然后对这个value集合进行处理,每个reduce产生0或1个输出,reduce的输出也是<key, value>形式的。

MapReduce处理大数据集的过程

3、wordcount源码分析

3.1、特别数据类型介绍

Hadoop提供了如下内容的数据类型,这些数据类型都实现了WritableComparable接口,以便使用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。

BooleanWritable:标准布尔型数值

ByteWritable:单字节数值

DoubleWritable:双字节数

FloatWritable:浮点数

IntWritable:整型数

LongWritable:长整型数

Text:使用UTF8格式存储的文本

NullWritable:当<key, value>中的key或value为空时使用

3.2、源代码

package org.apache.hadoop.examples;import java.io.IOException;import java.util.Iterator;import java.util.StringTokenizer;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.mapred.FileInputFormat;import org.apache.hadoop.mapred.FileOutputFormat;import org.apache.hadoop.mapred.JobClient;import org.apache.hadoop.mapred.JobConf;import org.apache.hadoop.mapred.MapReduceBase;import org.apache.hadoop.mapred.Mapper;import org.apache.hadoop.mapred.OutputCollector;import org.apache.hadoop.mapred.Reducer;import org.apache.hadoop.mapred.Reporter;import org.apache.hadoop.mapred.TextInputFormat;import org.apache.hadoop.mapred.TextOutputFormat;public class WordCount {public static class Map extends MapReduceBase implementsMapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(LongWritable key, Text value,OutputCollector<Text, IntWritable> output, Reporter reporter)throws IOException {String line = value.toString();StringTokenizer tokenizer = new StringTokenizer(line);while (tokenizer.hasMoreTokens()) {word.set(tokenizer.nextToken());output.collect(word, one);}}}public static class Reduce extends MapReduceBase implementsReducer<Text, IntWritable, Text, IntWritable> {public void reduce(Text key, Iterator<IntWritable> values,OutputCollector<Text, IntWritable> output, Reporter reporter)throws IOException {int sum = 0;while (values.hasNext()) {sum += values.next().get();}output.collect(key, new IntWritable(sum));}}public static void main(String[] args) throws Exception {JobConf conf = new JobConf(WordCount.class);conf.setJobName("wordcount");conf.setOutputKeyClass(Text.class);conf.setOutputValueClass(IntWritable.class);conf.setMapperClass(Map.class);conf.setCombinerClass(Reduce.class);conf.setReducerClass(Reduce.class);conf.setInputFormat(TextInputFormat.class);conf.setOutputFormat(TextOutputFormat.class);FileInputFormat.setInputPaths(conf, new Path(args[0]));FileOutputFormat.setOutputPath(conf, new Path(args[1]));JobClient.runJob(conf);}}

4、WordCount处理过程

1)将文件拆分成splits,由于测试用的文件较小,所以每个文件为一个split,并将文件按行分割形成<key, value>对,如下图所示,这一步由MapReduce框架自动完成,其中偏移量(即key值)包括了回车所占的字符数(Windows和Linux环境会不同)。

2)将分割好的<key, value>对交给用户定义的map方法进行处理,生成新的<key, value>对,如下图所示:

3)得到map方法输出的<key, value>之后,Mapper会将它们按照key值进行排序,并执行Combine过程,将key值相同的value值累加,得到Mapper的最终输出结果。如下图所示:

4)Reducer先对Mapper接收的数据进行排序,再交由用户自定义的reduce方法进行处理,得到新的<key, value>对,并作为wordcount的输出结果,如下图所示:

原文链接

MapReduce中wordcount详细介绍相关推荐

  1. HTML中Css详细介绍

    HTML中Css详细介绍 一.样式表的作用 1.Css样式表,层叠样式表 2.类似于人类的衣服,网页的衣服 3.作用:美化网页 4.优势: 1.内容与表现分离,便于维护 2.样式丰富,页面布局灵活 3 ...

  2. java中Cookie详细介绍

    Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...

  3. python如何使用多线程_python多线程应用中的详细介绍

    python多线程在应用的时候有不少的事情需要重点的注意.其实只要掌握这些相关的技术段就能保证这个应用的完整.下面我们来看看具体是需要如何进行操作. 今天看了近一天关于多线程的应用中,如何安全调用py ...

  4. mapreduce实现wordcount 详细解析

    总括 Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(G ...

  5. css中margin详细介绍

    深入理解css中的margin属性 转载自  http://www.cnblogs.com/zhuzhenwei918/p/6124263.html 深入理解css中的margin属性 之前我一直认为 ...

  6. java中file_详细介绍Java中的File类

    构造方法File f = new File("文件路径") File f = new File("parent","child") 创建一个 ...

  7. 60-300-022-使用-延迟数据-Flink中allowedLateness详细介绍

    1.视界 2.概述 ​ 当指定一个允许延迟大于0时,window以及window中的内容将会继续保持即使水印已经达到了window的最后时间.在这种情况下,当一个延迟事件到来而未丢弃时,它可能会触发w ...

  8. pythonexcel介绍_Python 中pandas.read_excel详细介绍

    Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r& ...

  9. autosar中com模块_详细介绍AUTOSAR各个模块作用PART1(OS,SYS)

    这片文章中我们详细讲解下每个模块的功能,上图是vector的autosar方案,每个模块的详细介绍后续会有单独文章进行讲解,请关注.以下是各个模块的简介 1.VHSM hardware Securit ...

最新文章

  1. 在线作图|2分钟在线绘制RDA图
  2. WPF中的容器控件——GridSplit
  3. 字节顺序:高位优先(big-endian)和低位优先(little-endian)
  4. PHP中error_reporting()用法详解
  5. lpc2000 filash utility 程序烧写工具_单片机烧录程序的次数
  6. 翻译 - EXT JS 5:Controlling an Application with Router
  7. java当前路径_java获取当前路径的几种方法
  8. 用notepad++打造自己的C/C++语言IDE --是时候和DOS屏幕说再见了
  9. oracle linux下数据迁移到不同服务器
  10. eclipse 启动 tomcat : Multiple Contexts have a path of /SOAProject
  11. react-native修改android包名-上传应用市场
  12. web前端设计与开发作品:旅游酒店网站设计——中国风的温泉酒店预订网站全套html模板(13页) HTML+CSS+JavaScript
  13. 斯坦福大学CS224N-深度学习与自然语言处理:课程1-笔记
  14. Linux操作系统入门培训_Linux/Unix基础培训教程视频课程-风哥-专题视频课程
  15. 西门子PLC 1200和V20变频器USS通讯
  16. python-基站位置查询
  17. undefined和null区别
  18. zhu的Oracle数据库笔记
  19. 不要因为错爱而寂寞一生
  20. Grid++ Report6.5使用

热门文章

  1. 计算机协会申请流程,成立计算机协会的申请书
  2. Android系统上的RTSP播放器
  3. XSS跨站脚本攻击(DVWA XSS攻击详解、XSS平台搭建)
  4. 解决X210开发板被刷成砖的问题
  5. 远程连接数据库失败解决办法
  6. 设计模式——(12)组合模式
  7. android音乐播放器 毕业论文,毕业论文-- 基于Android系统的音乐播放器的实现 .doc...
  8. 【商品详情 +关键词搜索】API 接口系列
  9. Longest Well-Performing Interval 表现良好的最长时间段
  10. linux查看进程运行命令行参数,linux查看进程运行命令