Map Reduce 是 Google 在 2004 年发表的一篇论文,原文链接 在这 后来 Hadoop 直接内置了这一框架。

读完之后记录一下心得。

主要背景:MapReduce 的出现很具有工程特性,在海量数据出现后,面临的问题是我们如何利用大量的,性能不是很强的服务器对数据进行处理。

主要思想:主要思想也很简单,分治的思想解决问题。把大量的数据划分成较小的,单机可处理的数据,对不同的主机进行任务划分,最终合并结果。主机之间的连接通过。

主要模型:

整个 Map Reduce 阶段如下图所示,先做数据的划分,然后由一个 master 节点划分出不同的 worker,然后分配给不同的 worker 进行 Map 或者 Reduce 操作。Map 后的结果进行 Reduce 操作,得到最终的结果。

可以看到,主要完成的计算有两个: Map() 和 Reduce() ,这两个函数从语义上已经很好理解,Map 函数的 input 是一组 key-value 对,output 也是一组 key-value 对。主要功能是把原先的大数据量下的 k-v 映射到一个新的空间下的 k-v 。

Reduce 函数的 input 基于 Map 函数产出的 k-v,output 是处理后的结果,但基本都是在原先的数据上做汇总处理。也就是 reduce 的语义。

Google 给出的Map-Reduce 函数模型如下:

map (k1, v1) -> list (k2, v2)
reduce(k2, list(v2)) -> list(v2)

给个栗子,现在有十副牌已经混乱,现在需要在其中找出一副牌,用 MapReduce 的思想来处理这个问题,就可以分成两个阶段,Map 阶段,把 10 副牌进行划分,对每一个划分而言做 Map 操作,这里的 Map 操作可以为把手中的牌分为4类 ♥️,♣️,♦️,♠️这四类。然后对这四类的结果做 Reduce 操作,即从每个花色找到13张不同的牌,这样,就可以找到一副完整的扑克牌。

map(list pokers) :
for poker in pokers:
dic[getClass(poker)].append(poker)
return dic;
reduce(list hearts, list diamonds, list clubs, list spades):
finish(hearts)
finish(diamonds)
finish(clubs)
finish(spades)

整个过程在理论上而言很简单,也很容易理解。难点主要集中在下面几个部分

  1. 如何做数据的划分
  2. 如何对大量的主机做调度
  3. 如果某一个主机出现了失败如何处理
  4. 主机间的通信如何管理

失败的处理:

Master 通过心跳机制来维护对 worker 的管理,由于单机的 worker 会先把 Map 的结果存在本地,所以,如果一个 worker A失去维护,那么这个 worker 的任务将会被重新进行编排分给 worker B。并且,所有进行 Reduce 操作的 worker 都会收到通知,因为 Reduce 需要的数据可能会从 A 读,所以,需要通知所有进行 Reduce 操作的 worker。

如果 Master 失败,由于 Master 只有一个,所以 Master 会定期进行状态存储,如果 Master 失败,则人工恢复到最新状态。

一些优化:

Backup Task:因为总的时间会受耗时最长的任务影响,而对于某个耗时最长任务而言,可能不是其任务本身带来的负面影响导致其处理时间延长,而是执行这个任务的机器自身的影响。所以,对于一个快要结束的任务,Master 会为其分配一个 backup 的操作,这个 backup 状态和之前的一样,只是在不同的机器上执行。如果这两个任务中任何一个完成,那么就视为这个任务已经完成。而这个 backup 操作提升时间也是非常显著的,大概能有44%的提升。

Ordering Guarantee:在一个 map 操作完成后,进行 sort 操作,保证其的顺序,这样对于 reduce 而言,在进行查找的时候,会变得非常高效。

Combiner Function:在 map 操作完成后,在本地进行 combine 操作,可以减少数据的传输,也可以减少 Reduce 的数据量。

Map Reduce 论文阅读的更多相关文章

  1. python基础——map/reduce

    python基础——map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Pro ...

  2. 用通俗易懂的大白话讲解Map/Reduce原理

    Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...

  3. hadoop入门级总结二:Map/Reduce

    在上一篇博客:hadoop入门级总结一:HDFS中,简单的介绍了hadoop分布式文件系统HDFS的整体框架及文件写入读出机制.接下来,简要的总结一下hadoop的另外一大关键技术之一分布式计算框架: ...

  4. Map Reduce和流处理

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由@从流域到海域翻译,发表于腾讯云+社区 map()和reduce()是在集群式设备上用来做大规模数据处理的方法,用户定义一个特定的映射 ...

  5. 论文阅读笔记六:FCN:Fully Convolutional Networks for Semantic Segmentation(CVPR2015)

    今天来看一看一个比较经典的语义分割网络,那就是FCN,全称如题,原英文论文网址:https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn ...

  6. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  7. [转] map/reduce

    如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念. ...

  8. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  9. 函数式编程(1)-高阶变成(1)-map/reduce

    map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on ...

随机推荐

  1. RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?

    目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest Roc ...

  2. java第4天:String static Arrays类,Math类

    1 字符串的概述和特点 字符串一旦创建,是不可变的. 有双引号的就是字符串 *** 2 字符串的三种构造方法 2-1 第一种: 格式:String str = new String();| :-| 2 ...

  3. 写mysql语句时tab键与空格键

    某网页上复制的一份mysql语句,报错,重写一遍后,好了,对比后,发现, 可以看到在sublime text中,网上复制的缩进是空白的,tab键是横杠,空格键是一个点

  4. ConcurrentHashMap实现原理以及源码分析

    ConcurrentHashMap是HashMap的高并发版本,是线程安全的,而HashMap是非线程安全的 一.底层实现 底层结构跟hashmap一样,都是通过数组+链表+红黑树实现的,不过它要保证 ...

  5. bugku 一个普通的压缩包

    压缩包打不开,用winhex打开压缩包,发现头文件是zip的,将后缀改为zip,成功解压. 打开发现还是个压缩包,而且打不开,提示secret.png损坏,使用winhex打开. 将a8 3c 7a ...

  6. CH3801Rainbow的信号

    Description Freda发明了传呼机之后,rainbow进一步改进了传呼机发送信息所使用的信号.由于现在是数字.信息时代,rainbow发明的信号用N个自然数表示.为了避免两个人的对话被大坏 ...

  7. [WPF自定义控件库] 模仿UWP的ProgressRing

    1. 为什么需要ProgressRing 虽然我认为这个控件库的控件需要模仿Aero2的外观,但总有例外,其中一个就是ProgressRing.ProgressRing是来自UWP的控件,部分代码参考 ...

  8. drf框架安装配置及其功能概述

    0902自我总结 drf框架安装配置及其功能概述 一.安装 pip3 install djangorestframework 二.配置 # 注册drf app NSTALLED_APPS = [ # ...

  9. 微信小程序与用户交互

    微信小程序与用户交互 一.显示消息提示框 wx.showToast({属性名:属性值}) 自定义一个提示框,时间到了会自动关闭 wx.showToast({ title:"成功", ...

  10. Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?

    在Java的Integer类中,有Integer.valueOf(String s)和Integer.parseInt(String s)两个静态方法,他们都能够将字符串转换为整型,他们到底有什么区别 ...