一、什么是:

  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. hdu4336 Card Collector(概率DP,状态压缩)

    In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...

  2. Oracle Partition 分区详细总结

    此文从以下几个方面来整理关于分区表的概念及操作:        1.表空间及分区表的概念        2.表分区的具体作用        3.表分区的优缺点        4.表分区的几种类型及操作 ...

  3. 洛谷 [P2594] 染色游戏

    博弈论+SG函数的应用 这是一个二维翻硬币问题 一维翻硬币问题有一个结论: 局面的SG值等于局面中所有反面朝上的硬币单独存在时的SG值的异或和 这个结论同样适用于二维的翻硬币问题 证明可以用数学归纳法 ...

  4. Dreamweaver8中文版视频教程 [爱闪教程]Dreamweaver8中文版

    原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] http://www.176net.com/shipin/UploadFiles_1476/teach1/%5B% ...

  5. 【Android】状态栏通知Notification、NotificationManager详解(转)

    在Android系统中,发一个状态栏通知还是很方便的.下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置? 首先,发送一个状态栏通知必须用到两个类:  NotificationMa ...

  6. SQL自动生成A到Z二十六个英文字母

    if object_id('#tempdriveinfo') is not null drop table #tempdriveinfo create table #tempdriveinfo ( [ ...

  7. numpy数组之读写文件

    目录 通过 numpy 读写 txt 或 csv 文件 通过 numpy 读写 npy 或 npz 文件 读写 npy 文件 读写 npz 文件 通过 h5py 读写 hdf5 文件 简单读取 通过切 ...

  8. python多线程(四)

    原文:http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html 本文介绍了Python对于线程的支持,包括“学会”多线程编程需要掌握的基础 ...

  9. python type()函数

    我怎么把一个变量的类型写入文件?a = 3type(a)貌似返回的是type类型,不能打印,也不能用文件的write怎么半,或者怎么转换成srt之类的? type()函数得到的是一个类型而不是字符串, ...

  10. RabbitMQ 简介以及使用场景

    目录 一. RabbitMQ 简介 二. RabbitMQ 使用场景 1. 解耦(为面向服务的架构(SOA)提供基本的最终一致性实现) 2. 异步提升效率 3. 流量削峰 三. 引入消息队列的优缺点 ...