MapReduce到底解决什么问题?

MapReduce准确的说,它不是一个产品,而是一种解决问题的思路,能够用分治策略来解决问题。例如:网页抓取、日志处理、索引倒排、查询请求汇总等等问题。通过分治法,将一个大规模的问题,分解成多个小规模的问题(分),多个小规模问题解决,再统筹小问题的解(合),就能够解决大规模的问题。最早在单机的体系下计算,当输入数据量巨大的时候,处理很慢。如何能够在短时间内完成处理,很容易想到的思路是,将这些计算分布在成百上千的主机上,但此时,会遇到各种复杂的问题,例如:并发计算、数据分发、错误处理、数据分布、负载均衡、集群管理与通信等,将这些问题综合起来将是比较复杂的问题了,而Google为了方便用户使用系统,提供给了用户很少的接口,去解决复杂的问题。

    (1) Map函数接口:处理一个基于key/value(后简称k/v)的数据对(pair)数据集合,同时也输出基于k/v的数据集合。

    (2) Reduce函数接口:用来合并Map输出的k/v数据集合

假设我们要统计大量文档中单词出现的次数

  Map

    输入K/V:pair(文档名称,文档内容)

    输出K/V:pair(单词,1)

  Reduce

    输入K/V:pair(单词,1)

    输出K/V:pair(单词,总计数) 

  Map伪代码:

1

2

3

4

5

Map(list<pair($docName, $docContent)>){//如果有多个Map进程,输入可以是一个pair,不是一个list

        foreach(pair in list)

                foreach($word in $docContent)

                        print pair($word, 1); // 输出list<k,v>

}           

  Reduce伪代码:

1

2

3

4

5

6

7

8

9

10

Reduce(list<pair($word, $count)>){//大量(word,1)(即使有多个Reduce进程,输入也是list<pair>,因为它的输入是Map的输出)

    map<string,int> result;

        foreach(pair in list)

         if result.isExist($word)             result[$word] += $count;

         else

              result[$word] = 1;

        foreach($keyin result)

                print pair($key, result[$key]); //输出list<k,v>

}

  

  可以看到,R个reduce实例并发进行处理,直接输出最后的计数结果。需要理解的是,由于这是业务计算的最终结果,一个单词的计数不会出现在两个实例里。即:如果(a, 256)出现在了实例1的输出里,就一定不会出现在其他实例的输出里,否则的话,还需要合并,就不是最终结果。

  再看中间步骤,map到reduce的过程,M个map实例的输出,会作为R个reduce实例的输入。

  问题一:每个map都有可能输出(a, 1),而最终结果(a, 256)必须由一个reduce输出,那如何保证每个map输出的同一个key,落到同一个reduce上去呢?

    这就是“分区函数”的作用。分区函数是使用MapReduce的用户按所需实现的,决定map输出的每一个key应当落到哪个reduce上的函数。如果用户没有实现,会使用默认分区函数。为了保证每一个reduce实例都能够差不多时间结束工作任务,分区函数的实现要点是:尽量负载均衡,即数据均匀分摊,防止数据倾斜造成部分reduce节点数据饥饿。如果数据不是负载均衡的,那么有些reduce实例处理的单词多,有些reduce处理的单词少,这样就可能出现所有reduce实例都处理结束,最后等待一个需要长时间处理的reduce情况。

  问题二:每个map都有可能输出多个(a, 1),这样就增大了网络带宽资源以及reduce的计算资源,怎么办?

    这就是“合并函数”的作用。有时,map产生的中间key的重复数据比重很大,可以提供给用户一个自定义函数,在一个map实例完成工作后,本地就做一次合并,这样将大大节约网络传输与reduce计算资源。合并函数在每个map任务结束前都会执行一次,一般来说,合并函数与reduce函数是一样的,区别是:合并函数是执行map实例本地数据合并,而reduce函数是执行最终的合并,会收集多个map实例的数据。对于词频统计应用,合并函数可以将:一个map实例的多个(a, 1)合并成一个(a, count)输出。

  问题三:如何确定文件到map的输入呢?

    随意即可,只要负载均衡,均匀切分输入文件大小就行,不用管分到哪个map实例都能正确处理

  问题四:map和reduce可能会产生很多磁盘io,将更适用于离线计算,完成离线作业。

MapReduce计算模型(二)相关推荐

  1. 从 WordCount 到 MapReduce 计算模型

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

  2. 3 MapReduce计算模型

    MapReduce被广泛应用于日志分析.海量数据排序.在海量数据中查找特定模式等场景中. MapReduceJob 在Hadoop中,每个MapReduce任务都被初始化为一个Job. 每个Job又可 ...

  3. 大数据Hadoop(十六):MapReduce计算模型介绍

    文章目录 MapReduce计算模型介绍 理解MapReduce思想 Hadoop MapReduce设计构思

  4. 大数据图数据库之离线挖掘计算模型

    /* 版权声明:可以任意转载,转载时请务必标明文章原始出处和作者信息 .*/             author: 张俊林 节选自<大数据日知录:架构与算法>十四章,书籍目录在此 对于离 ...

  5. 大数据计算技术-数据计算处理系统-计算模式(计算模型)

    大数据计算技术-数据计算处理系统-计算模式(计算模型) 1计算模式(计算模型) 1.1批处理计算模式:数据计算处理系统例子:MapReduce计算模型 1.2流计算模式 1.2.1定义 1.2.2流计 ...

  6. Hadoop详解(六):MapReduce计算框架详解

    1. Hadoop MapReduce简介 Hadoop MapReduce是一个使用简便的软件框架,是Google云计算模型MapReduce的Java开源实现,基于它写出来的应用程序能够运行在由上 ...

  7. Storm 02_Storm 计算模型

    一.Storm 计算模型 Topology – DAG有向无环图的实现 对于Storm实时计算逻辑的封装 即,由一系列通过数据流相互关联的Spout.Bolt所组成的拓扑结构 生命周期:此拓扑只要启动 ...

  8. 【Hadoop】谷歌的三篇论文(GFS、MapReduce分布式计算模型 、BigTable大表)

    谷歌的三篇论文(GFS.MapReduce分布式计算模型 .BigTable大表) 0 谷歌的基本思想:三驾马车 1 第一篇论文:GFS 1.1 Google的GFS分布式文件系统的基本原理 1.2 ...

  9. 大数据快速入门(05):MapReduce 编程模型赏析

    一.Hadoop 诞生的传奇故事 (上图是 Doug Cutting,hadoop 之父) 1985年,Cutting 毕业于美国斯坦福大学. Cutting 的第一份工作是在 Xerox 做实习生, ...

  10. ECCV2020最佳论文解读之递归全对场变换(RAFT)光流计算模型

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 计算机视觉三大国际顶级会议之一的 ECCV 2020 已经召开.今年 ECCV 共收到有效投稿 502 ...

最新文章

  1. win7下安装dynamips完全版
  2. element ui表格点击整行选择_element-ui实现动态表头的表格问题汇总
  3. ABAP检查日期and时间合法性的函数
  4. Docker(2):使用Dockerfile创建支持SSH服务的镜像
  5. WebBIOS使用手册
  6. 数据库身份证号用什么类型_鱼缸要不要铺底?用什么铺底?这3种类型,我有4个建议...
  7. 一款很好看的个人主页简单源码
  8. ae 的动画导出为html,Bodymovin v5.5.3 – AE导出Web动画插件+使用教程
  9. 解决 误删Path环境变量的问题
  10. 统计学三大相关系数之斯皮尔曼(spearman)相关系数
  11. 四种常用的ps抠图方法
  12. linux报错Error: /proc must be mounted
  13. 2017艾普兰机智云全家福
  14. CSS课堂案例8-小米布局
  15. h5 适配 iphoneX 的全面屏 (上有刘海 ,下有呼吸灯) ,在iphonX 上 fixed定位的问题
  16. 【IoT】卫朋:6000+ 字解读 | 2022年产品人必备的7个产品管理工具(1.0版)
  17. Oracle创建和查询索引
  18. 面向对象的特点?对象模型、动态模型和功能模型3种模型之间的关系?
  19. mysql相关的dll_libmySQL.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  20. Echarts基本使用(vue实现3D地图)

热门文章

  1. 计算机网络po3代表的意思,计算机系统与网络技术中常用的单词缩写的意思.pdf...
  2. Linux查询命令帮助语句,linux有关命令的帮助和用法查看
  3. php中几个数组函数array_slice() array_filter array_unique() in_array()
  4. php中通过post和get传递数组的方法
  5. Android开发20——单个监听器监听多个按钮点击事件
  6. Oracle中Lpad函数和Rpad函数的用法
  7. oj 26319 最大子序和
  8. ObjectAnimator实现菜单的弹出(扇形)
  9. [BZOJ 5074]小B的数字
  10. @Autowired与@Resource