一、什么是:

  MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

  源于Google MapReduce论文(04年)。

  Master - Slave 模式。

  MapReduce的核心是:分而治之,并行处理;以及其调度和处理数据的自动化。

  Hadoop中MR的主要内容:

    hadoop序列化writable接口,数据类型

    应用开发 (debug 单元测试)解决基本数据处理,作业调优

    工作机制  作业提交流程,作业调度,shuffle与排序

    MR类型 输入输出类型

    特性:二次排序(全排、部分排),join

    压缩算法

二、基本流程:

1、MR中主要是Map和Reduce两个阶段,其中基本流程是:

  1、mr的数据处理单位是一个split,一个split对应一个map任务,处理时会有多个map任务同时运行;当map从HDFS上读取一个split时,这里会有“移动计算,不移动数据”的机制来减少网络的数据传输,使得效率能最大化;

  2、获取到split时,默认会以TextInputFormat的格式读入,文件中的字符位置的偏移量作为 key,以及每一行的数据作为 value;

  3、之后则进入map函数中进行处理,这个阶段可以获取需要的数据并加以处理,并以key value的形式写出,作为后面reduce函数的输入;

  4、map到reduce之间会有一个shuffle的过程,大致过程是把不同key利用partitioner分散到各个reduce节点上去;

  5、在reduce上会先通过 比较排序(前面shuffl会有预排序) 进行文件的归并,之后进入reduce函数,在每个reduce函数中key是唯一的,对应的value则是一个 Iterable接口类型,通过Iterable可以遍历所有当前key对应的所有value;

  6、之后在reduce中对数据进行处理后,利用OutputFormat对处理后的key value保存到HDFS上即完成了整个流程。

  注:一个split的大小计算:max( minimumSize, min( maximumSize, blockSize ));

            通常 blockSize 在 minimumSize和maximumSize之间,所以一般分片大小就是块大小。

2、流程图:

  

3、编程中可定制的类:

  InputFormat —> Mapper —> Partitioner (HashPartitioner) —> Combiner —> Reducer —> OutputFormat

4、shuffle过程:map输出 到 reduce获取数据的过程。

 
  Map端:
    map输出 -> 写入内存缓冲区,考虑效率进行预排序 ->
    a. 达到缓冲区阈值(0.8),一个线程便开始把内容溢出到磁盘。在溢出到磁盘的过程中,map输出继续写到缓冲区,若此期间缓冲区被填满,map将被阻塞直到写磁盘过程完成。
    b. 每当达到缓冲区阈值时,就会新建一个溢出文件(spill file);因此在任务完成前,会有几个溢出文件,并最终合并成一个已分区且已排序的输出文件。
    c.在写入磁盘之前,线程首先根据reduce把数据划分成相应的分区(partition)。在每个分区中,会按键进行排序,如果有combiner,它就在排序后运行。combiner使得map输出更紧凑,可减少写到磁盘和传到reduce的数据。
 
    如果存在至少3个溢出文件,则combiner会在溢出文件合并前再次运行。如果低于3个则不会运行,因为不值得调用。
 
  Reduce端:
    map的输出存储在运行map任务的tasktracker的节点磁盘上。
 
    获取数据 -> 排序合并 -> reduce
    每个map节点运行时间不一样,只要有一个节点完成,reduce任务就会开始获取其输出。reduce任务有少量并行线程可同时获取map端数据。
    若map端输出很小,则数据会被复制到redeuce任务的JVM内存中。若大于一个指定阈值,则获取的数据会合并后存储到本地磁盘中,合并阶段会维持原map输出的键顺序。或指定有combiner,则会在合并期间运行以降低写入磁盘数据量。
    在redece阶段,会对已排序输出中的每键调用reduce函数,些阶段的输出直接写到HDFS上。
 
  combiner运行3次:分区内、溢出文件大于3、reduce合并文件
  排序运行2次:分区中预排序、reduce排序
  

三、优缺点:

  优点:

      1. 易于编程
      2. 良好的扩展性,增加机器来扩展计算能力
      3. 高容错性
      4. 适合PB级以上海量数据离线处理。
 
  缺点:
      1. 实时计算
      2. 流式计算
      3. DAG有向图计算
 
  应用:网站pv uv统计,搜索引擎索引,海量数据查找与统计,复杂数据分析算法实现。

  

Hadoop MapReduce基本原理的更多相关文章

  1. 从分治算法到 Hadoop MapReduce

    从分治算法说起 要说 Hadoop MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分解成多组相同或类似的子问题,对这些子问题再分,然后再 ...

  2. python - hadoop,mapreduce demo

    Hadoop,mapreduce 介绍 59888745@qq.com 大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽), 把用户的交易 ...

  3. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

  4. hadoop MapReduce Yarn运行机制

    原 Hadoop MapReduce 框架的问题 原hadoop的MapReduce框架图 从上图中可以清楚的看出原 MapReduce 程序的流程及设计思路: 首先用户程序 (JobClient) ...

  5. Hadoop Mapreduce分区、分组、二次排序过程详解[转]

    原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动   (1)最简单的过程:  map - reduce   (2) ...

  6. Hadoop MapReduce编程 API入门系列之薪水统计(三十一)

    不多说,直接上代码. 代码 package zhouls.bigdata.myMapReduce.SalaryCount; import java.io.IOException; import jav ...

  7. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  8. Hadoop MapReduce例子-新版API多表连接Join之模仿订单配货

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 一.    项目简介: 电子商务的发展以及电商平台的多样化,类似于京东和天猫这种拥有过亿用户的在线购 ...

  9. Writing an Hadoop MapReduce Program in Python

    In this tutorial I will describe how to write a simpleMapReduce program for Hadoop in thePython prog ...

随机推荐

  1. 刷题总结——选课(ssoj树形dp+记忆化搜索+多叉树转二叉树)

    题目: 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课 ...

  2. 扰动法--*BZOJ3157: 国王奇遇记

    求$\sum_{i=1}^ni^mm^i$.$n \leq 1e9,m \leq 200$. 其实我也不知道这东西为啥叫“扰动法”,大概是在黑暗的边缘试探?就是那种,人家再多一点就被您看破了,然后您就 ...

  3. T2038 香甜的黄油 codevs

    http://codevs.cn/problem/2038/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond   题目描述 Description 农夫John ...

  4. [Bzoj5043][Lydsy1709月赛]密码破译(按位dp)

    5043: [Lydsy1709月赛]密码破译 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 477  Solved: 125[Submit][Sta ...

  5. SSM框架笔记

    配置 Project结构 SpringMVC启用 Spring MVC配置 Spring自己主动扫描 getBean的方法 SpringMVC与Struts2的差别 Log4j 拦截器与过滤器 文件U ...

  6. Java安全之数字证书

    在前面说到.消息摘要用于验证数据完整性,对称与非对称加密用于保证数据保密性,数据签名用于数据的抗否认性,于是集这些安全手段于一身的终极武器--数字证书出现了.数字证书具备了加密/解密的必要信息.包括签 ...

  7. 多重继承下的virtual functions

    有如下图所示的继承关系: 有如下代码示例:                   在早期的未符合c++标准的的编译器上是会报错的,因为对于clone()函数来说,编译器不知道怎么处理处理.但是时至今日c ...

  8. [原创] 在线音乐API的研究 (Part 2.1)

    最近,在优化一个自己写的音乐播放器.主要目的是回顾.归纳,并希望能够写出一个属于自己的common lib.今天,主要是关于在线音乐API的一些分析结果.此次,主要分析的是歌词.专辑部分.在线搜索音乐 ...

  9. sublime 高速打开跳转至关联文件

    在下一枚web前端,近期在用sublime text2编辑器写前端.因为页面较多,项目较大,所以难免出现非常多引用文件和一些js的teample模板. 问题:在Sublime Text编写代码过程中要 ...

  10. 全文索引--自己定义chinese_lexer词典

    本文来具体解释一下怎样自己定义chinese_lexer此法分析器的词典 初始化数据 create table test2 (str1 varchar2(2000),str2varchar2(2000 ...