虽然Google的MapReduce论文很老了(十多年),但只要还没看,就值得一看。

概要

MapReduce是一种重视容错性的分布式并行计算模式,它把分布式并行计算分为map和reduce两个阶段:

  • map: 把输入数据集切分成很多份(1份可包含很多records),传给map函数做转换处理(每次处理1条record,得出1条结果),结果集被输出到文件
  • reduce: 读取map的结果集,传给reduce函数做归约处理(每次处理1条record,更新一条共享的结果),结果集被输出到文件

数据通常是key-value格式的,像HashMap,key关联着value。key是连接map和reduce的纽带,reduce通过key来拉取相关的map结果,把关联某个key的一批values归约成一个收敛的结果。

每台机器是一个node。map和reduce都可以在很多worker node上运行。1个任务=1个函数+1组输入数据,任务被分配到worker node上运行。有一个中央的调度器,叫做master node,来进行全局调度,给worker node分配任务。

示意图就不贴了,到处可见的WordCount例子也不写了,别人写过的我一般不写。请参考网络资料。例如这篇就挺好:https://mr-dai.github.io/mapr...

参考好了吗?继续吧!

优化

论文指出它是为大量廉价机器组成的环境而设计的,环境特点是:机器特别多,机器性能参差不齐,有的机器会突然坏掉。论文的很多优化都是在解决这种环境所特有的问题,这在当时是开创性的,因为一般的分布式并行技术都还在研究一组性能均等的高性能机器,不能容忍某台机器变慢或故障。现在工业界都是用MapReduce的方式在搞,因为多数企业的环境都是论文里说的这种。

Google推出MapReduce论文时已经考虑周密了,给出了很多优化点:
Map阶段:

  1. 一开始先把输入数据集切分成M片,每片一般16~64MB
  2. map完成时通知master,master记录所有map的完成情况和文件位置
  3. map tasks要切得小而多,建议远大于机器数,容易负载均衡(3个task分给2个node,均衡度肯定不如13个task分给2个node)
  4. map tasks尽量分配到靠近数据的node,以节省带宽
  5. 用combine函数做本地预合并,以减小map的输出结果集

Reduce阶段:

  1. reducer从mapper node下载输入文件
  2. reduce先写临时文件,完成时用原子的文件重命名操作
  3. reduce用lazy iterator读取输入,以节省内存

全阶段:

  1. map输出到本地文件,reduce输出到全局文件
  2. map和reduce都可有多个副本同时重复执行,谁快就用谁的结果(即使有个副本突然变慢,也有别的副本在跑)
  3. 总有一些落后进程,增加百分之几的备用资源,就能加速扫除长尾,节省百分之几十的时间
  4. 调度器尽量把任务分配给空闲的worker,因此速度快的worker自然会处理更多tasks
  5. 遇到错误的record,写标记到master,再有task遇到时跳过它

注释:
这种“总有一些落后进程”的现象叫做尾部延迟放大(tail delay amplification),分布式数据库执行查询的scatter/gatter模式也有此问题。
Google的解法相当于task rebalance,来个比喻:让先进员工帮助落后员工完成积压的任务,以保证全团队的项目按时完成。
我们要知道,“计算易移动,数据难移动”,我们总是倾向于把计算移动到另一处,而不是把数据移过去。
MapReduce就是移动了计算,并且把计算尽可能移动到数据附近。task rebalance只移动计算,无需移动数据,所以才管用。
而分布式数据库在执行查询时,把计算分发到data node上,如果有的data node反应慢,就没有办法,因为数据不好移。

MapReduce精髓相关推荐

  1. mapreduce v1.0学习笔记

    它是什么? 一个用于处理大数据开源的分布式计算框架,它由java实现,原生提供java编程交互接口,其它语言通过hadoop streaming方式和mapreduce框架交互. 可以做什么? 利用框 ...

  2. 从 WordCount 到 MapReduce 计算模型

    概述 虽然现在都在说大内存时代,不过内存的发展怎么也跟不上数据的步伐吧.所以,我们就要想办法减小数据量.这里说的减小可不是真的减小数据量,而是让数据分散开来.分开存储.分开计算.这就是 MapRedu ...

  3. 掌握计算机科学的精髓,从这本豆瓣评分9.3的书开始

    对计算机科学的掌握程度,决定了一个计算机行业从业者能走多远. 有了对计算机科学本质的认识,一个计算机专业的学生,通过一段时间的刻意练习和经验积累,就有可能成为计算机领域的专家.而练习则需要讲究方式方法 ...

  4. mapreduce理解_大数据

    map:对不同的数据进行同种操作 reduce:按keys 把数据规约到一起 看这篇文章请出去跑两圈,然后泡一壶茶,边喝茶,边看,看完你就对hadoop 与MapReduce的整体有所了解了. [前言 ...

  5. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  6. 第2节 mapreduce深入学习:4, 5

    第2节 mapreduce深入学习:4.mapreduce的序列化以及自定义排序 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化 ...

  7. 第一个MapReduce程序

    计算文件中每个单词的频数 wordcount 程序调用 wordmap 和 wordreduce 程序. 1 import org.apache.hadoop.conf.Configuration; ...

  8. hadoop程序MapReduce之SingletonTableJoin

    需求:单表关联问题.从文件中孩子和父母的关系挖掘出孙子和爷奶关系 样板:child-parent.txt xiaoming daxiong daxiong alice daxiong jack 输出: ...

  9. 初学Hadoop之图解MapReduce与WordCount示例分析

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

最新文章

  1. 某大厂程序员抱怨:“大厂镀金”是鬼话!从大厂裸辞后,面阿里、字节全都挂掉,连货拉拉都不要自己!...
  2. SpringMVC的请求-获得请求参数-获得集合类型参数1
  3. matplotlib动画入门(1):基本概念
  4. java key value 数据类型_JAVA面试锦囊(一)
  5. c++设计一个无法被继承的类
  6. 计算机更新和网络有关系吗,路由器跟网速有关系吗 电脑的网速慢怎么调
  7. mqtt测试工具(持续更新...)
  8. 2011年8月8日我搬到cnblog http://www.cnblogs.com/liuning8023/ (搬家的好日子啊)
  9. Android的屏幕多样性支持
  10. 大学计算机专业清华,中国计算机专业最“牛”的4所大学,清华第1,当之无愧...
  11. Eclipse插件TPTP-程序Profile与分析工具详细教程
  12. [论文笔记]Self-Attention Generative Adversarial Networks
  13. Android中图片压缩方案详解
  14. ABP的一些特性 (Attribute)
  15. vector做函数参数和普通数组做函数参数有什么区别
  16. MOSFet 的类型和区别:NP沟道,增强耗尽
  17. 两个List合并,并且按某一个字段排序
  18. Matlab 将计算结果制作成 gif 动画
  19. MATLAB 迷宫游戏
  20. 【收藏】构建属于自己的云端知识库——语雀

热门文章

  1. WCF 第五章 行为 事务之选择一个事务协议-OleTx 或者WS-AT
  2. 咏南WEB APP开发框架
  3. 解决苹果手机返回不刷新问题
  4. 转载:margin外边距合并问题以及解决方式
  5. 线程创建 pthread_create 中自定义参数注意事项
  6. 《你必须知道的.NET》--简易不简单:认识枚举(Ⅲ)
  7. mysql数据库学习——5,数据类型,字符集和校对
  8. Linux服务器的优化
  9. Android的内容观察者
  10. 直接拿来用!超实用的Java数组技巧攻略