从 0 开始学大数据
李智慧
同程艺龙交通首席架构师,前 Intel 大数据架构师,《大型网站技术架构》作者
71151 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
智慧写给你的寄语 (1讲)
从 0 开始学大数据
15
15
1.0x
00:00/00:00
登录|注册

08 | MapReduce如何让数据完成一次旅行?

Partitioner实现
shuffle过程
TaskTracker进程
JobTracker进程
大数据应用进程
理解MapReduce作业的启动和运行机制,shuffle过程的作用和实现原理对理解大数据的核心原理至关重要
MapReduce框架在分布式大规模服务器集群上并行执行并不简单
MapReduce编程相对简单
计算处理后的响应给用户
用户请求的数据旅程
数据合并与连接机制
作业启动和运行机制
工程师只需遵循MapReduce编程模型就可开发复杂的大数据计算程序
将大数据计算过程切分为Map和Reduce两个阶段
总结
思考题
MapReduce计算框架
MapReduce编程模型
MapReduce如何让数据完成一次旅行?

该思维导图由 AI 生成,仅供参考

上一期我们聊到 MapReduce 编程模型将大数据计算过程切分为 Map 和 Reduce 两个阶段,先复习一下,在 Map 阶段为每个数据块分配一个 Map 计算任务,然后将所有 map 输出的 Key 进行合并,相同的 Key 及其对应的 Value 发送给同一个 Reduce 任务去处理。通过这两个阶段,工程师只需要遵循 MapReduce 编程模型就可以开发出复杂的大数据计算程序。
那么这个程序是如何在分布式集群中运行起来的呢?MapReduce 程序又是如何找到相应的数据并进行计算的呢?答案就是需要 MapReduce 计算框架来完成。上一期我讲了 MapReduce 既是编程模型又是计算框架,我们聊完编程模型,今天就来讨论 MapReduce 如何让数据完成一次旅行,也就是 MapReduce 计算框架是如何运作的。
首先我想告诉你,在实践中,这个过程有两个关键问题需要处理。
如何为每个数据块分配一个 Map 计算任务,也就是代码是如何发送到数据块所在服务器的,发送后是如何启动的,启动以后如何知道自己需要计算的数据在文件什么位置(BlockID 是什么)。
处于不同服务器的 map 输出的 <Key, Value> ,如何把相同的 Key 聚合在一起发送给 Reduce 任务进行处理。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

MapReduce是一种用于大数据计算的编程模型和计算框架,通过将计算过程切分为Map和Reduce两个阶段,实现了复杂的大数据计算程序的开发。文章介绍了MapReduce计算框架的运行机制和数据合并与连接机制。在MapReduce作业启动和运行机制中,通过JobTracker和TaskTracker进程的协作,实现了作业的调度和监控,将计算任务分布在整个集群中运行。而在数据合并与连接机制中,通过shuffle过程将不同服务器上的相关数据合并到一起进行下一步计算,实现了数据的内在关系和价值的呈现。这些机制使得MapReduce能够在分布式的大规模服务器集群上并行执行,发挥大数据的作用。文章通过详细解释MapReduce的运行过程和shuffle过程,帮助读者深入理解了大数据计算的核心原理。 MapReduce框架的运行机制和数据合并与连接机制是本文的重点内容。通过JobTracker和TaskTracker进程的协作,MapReduce实现了作业的调度和监控,将计算任务分布在整个集群中运行。同时,shuffle过程将不同服务器上的相关数据合并到一起进行下一步计算,展现了数据的内在关系和价值。这些机制使得MapReduce能够在分布式的大规模服务器集群上并行执行,发挥大数据的作用。文章通过详细解释MapReduce的运行过程和shuffle过程,帮助读者深入理解了大数据计算的核心原理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学大数据》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(75)

  • 最新
  • 精选
  • 张贝贝
    有个问题,为什么mapper计算完的结果要放到硬盘呢?那再发送到reducer不是还有个读取再发送的过程吗?这中间不就有一个重复的写和读的过程吗?

    作者回复: 是的,主要为了可靠性,spark就不写硬盘,所以快。

    2018-11-15
    2
    114
  • 冬冬
    老师您好,有个问题,当某个key聚集了大量数据,shuffle到同一个reduce来汇总,考虑数据量很大的情况,这个会不会把reduce所在机器节点撑爆?这样任务是不是就失败了?

    作者回复: 会的,数据倾斜,会导致任务失败。严重的数据倾斜可能是数据本身的问题,需要做好预处理

    2018-11-16
    2
    102
  • 格非
    MapReduce的思想有点类似分而治之,将一个大任务分割成小任务,分发给服务器去处理,然后汇总结果,这是MapReduce的优势,但是MapReduce也就限制在了只能处理这种可以分割的任务上,比如,统计文本中的不同单词的个数,不知道我这种想法是否正确,还想请老师指教,另外,能否分享一下MapReduce这种技术的局限性呢?

    作者回复: 是的,比如MapReduce没法计算斐波那契数列,因为不能分片计算。 但是大数据场景几乎都是可以分片计算的。

    2018-11-15
    3
    72
  • still0007
    有一个疑问,之前讲到“移动计算而不是移动数据”,但是在shuffle的过程中,涉及到大量的移动数据,这又是为什么呢?

    作者回复: 移动计算主要是map阶段,reduce阶段数据还是要移动数据合并关联,不然很多计算无法完成

    2018-11-15
    5
    44
  • 星凡
    请问一下,map和reduce有绝对的先后关系吗,还是说可以一边map一边reduce

    作者回复: 绝对先后关系,一个reduce必须要他前置的所有map执行完才能执行。 MapReduce框架会在85%的map程序执行完成时,开始启动reduce程序,reduce程序一边shuffle已完成的map数据,一边等待未完成的map继续执行,直到全部map完成,reduce才开始执行计算。

    2019-10-05
    2
    40
  • hua168
    实际操作中是不是通过hive去完成MapReduce 的? 如果有一台机子一直卡在那里,整个job就差它一个返回数据,是不是整个job在等待状态?这种怎么处理?

    作者回复: 如果是SQL操作,就用hive,不用自己编程MapReduce。 如果机器故障导致某个任务很慢,MapReduce框架会启动多个任务进程在多个服务器同时计算同一个数据块,那个算完输出那个,不会一直等。 需要一直等的是数据偏移,某个key聚集了太多数据,大量数据shuffle到一个reduce计算,job一直等这个任务。

    2018-11-15
    4
    38
  •  臣馟飞扬
    看其他资料上介绍,shuffle过程从map的输入就已经开始了,与老师介绍的好像不太一致哦,这个过程应该是什么样?

    作者回复: 对于单个map任务,必须要map结束才能开始shuffle,因为map计算之后,还有个combine,数据还没完全准备好,不能shuffle。 对于整个作业,可以在大部分map任务完成后,也就是80%的map任务完成后启动shuffle,但是能进行shuffle的必须是已经完成的map任务的输出数据,没完成的map任务不能shuffle。

    2020-02-26
    4
    21
  • Goku
    请问JobTracker和之前讲到的NameNode是在同一个服务器上的吗?

    作者回复: 通常不会

    2018-12-28
    2
    20
  • slam
    想问下,在Hadoop上跑计算任务,在极端异常的条件下(数据机器down,网络隔离,namenode切换),能保证计算要么返回失败要么给出可信的结果吗?背景是这样的,考量在大数据平台上做资金的清算,非程序的错误,计算结果不能有错有漏,在单机db上这个肯定ok,不考虑事务前提下,Hadoop计算是否也毫无问题?可能考量数据一致性、任务状态一致性等方面,我了解太浅,想请教下老师,这种要求绝对计算准确的场景,hadoop目前胜任吗?

    作者回复: 没有问题,一般宕机也能计算完成,MapReduce有容错能力。计算结果不会有问题。

    2018-11-15
    20
  • hunterlodge
    老师,您给出的Partitioner的代码所反映的算法不会影响集群的扩展性吗?为什么不是采用一致性哈希算法呢?

    作者回复: 不会,调用partitioner是一个job的任务分配,动态的,结束了就完成了,不存在扩展性问题。

    2018-11-19
    19
收起评论
显示
设置
留言
75
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部