08 | MapReduce如何让数据完成一次旅行?
08 | MapReduce如何让数据完成一次旅行?
讲述:李智慧
时长11:27大小5.24M
MapReduce 作业启动和运行机制
MapReduce 数据合并与连接机制
小结
思考题
赞 14
提建议
精选留言(75)
- 张贝贝2018-11-15有个问题,为什么mapper计算完的结果要放到硬盘呢?那再发送到reducer不是还有个读取再发送的过程吗?这中间不就有一个重复的写和读的过程吗?
作者回复: 是的,主要为了可靠性,spark就不写硬盘,所以快。
共 2 条评论106 - 冬冬2018-11-16老师您好,有个问题,当某个key聚集了大量数据,shuffle到同一个reduce来汇总,考虑数据量很大的情况,这个会不会把reduce所在机器节点撑爆?这样任务是不是就失败了?
作者回复: 会的,数据倾斜,会导致任务失败。严重的数据倾斜可能是数据本身的问题,需要做好预处理
共 2 条评论97 - 格非2018-11-15MapReduce的思想有点类似分而治之,将一个大任务分割成小任务,分发给服务器去处理,然后汇总结果,这是MapReduce的优势,但是MapReduce也就限制在了只能处理这种可以分割的任务上,比如,统计文本中的不同单词的个数,不知道我这种想法是否正确,还想请老师指教,另外,能否分享一下MapReduce这种技术的局限性呢?
作者回复: 是的,比如MapReduce没法计算斐波那契数列,因为不能分片计算。 但是大数据场景几乎都是可以分片计算的。
共 3 条评论67 - still00072018-11-15有一个疑问,之前讲到“移动计算而不是移动数据”,但是在shuffle的过程中,涉及到大量的移动数据,这又是为什么呢?
作者回复: 移动计算主要是map阶段,reduce阶段数据还是要移动数据合并关联,不然很多计算无法完成
共 5 条评论38 - hua1682018-11-15实际操作中是不是通过hive去完成MapReduce 的? 如果有一台机子一直卡在那里,整个job就差它一个返回数据,是不是整个job在等待状态?这种怎么处理?
作者回复: 如果是SQL操作,就用hive,不用自己编程MapReduce。 如果机器故障导致某个任务很慢,MapReduce框架会启动多个任务进程在多个服务器同时计算同一个数据块,那个算完输出那个,不会一直等。 需要一直等的是数据偏移,某个key聚集了太多数据,大量数据shuffle到一个reduce计算,job一直等这个任务。
共 3 条评论36 - 星一2019-10-05请问一下,map和reduce有绝对的先后关系吗,还是说可以一边map一边reduce
作者回复: 绝对先后关系,一个reduce必须要他前置的所有map执行完才能执行。 MapReduce框架会在85%的map程序执行完成时,开始启动reduce程序,reduce程序一边shuffle已完成的map数据,一边等待未完成的map继续执行,直到全部map完成,reduce才开始执行计算。
共 2 条评论35 - 清清2018-11-22老师讲得很好,同学问的问题也很好,有些疑问翻评论区就解决了32
- 细小软也会有梦想2019-02-15shuffle过程中的两次排序。这个很重要吧,需要提一下啊,我就被网易的面试官问过。共 2 条评论24
- 多襄丸2018-11-171.数据从PC/Mobile端发动给服务器端 2.服务器端收到数据后在分布式集群下会进入到某个Server端,数据经过一系列的业务操作后可能会被记录下来 3.这些记录下来的数据会以文件形式存放于某个固定位置 4.数据推送工具可将这些固定位置的文件推送到大数据平台 5.大数据平台的Map Reduce框架会根据程序应用主动读取数据作为Map/Reduce的数据输入 6.大数据平台清晰完数据后以文件形式输出 7.服务器端去大数据平台存放文件的位置获取文件,并进行解析入库。 8.最终,数据以图形形式展示在报告上。展开共 1 条评论20
- 臣馟飞扬2020-02-26看其他资料上介绍,shuffle过程从map的输入就已经开始了,与老师介绍的好像不太一致哦,这个过程应该是什么样?
作者回复: 对于单个map任务,必须要map结束才能开始shuffle,因为map计算之后,还有个combine,数据还没完全准备好,不能shuffle。 对于整个作业,可以在大部分map任务完成后,也就是80%的map任务完成后启动shuffle,但是能进行shuffle的必须是已经完成的map任务的输出数据,没完成的map任务不能shuffle。
共 4 条评论20 - Goku2018-12-28请问JobTracker和之前讲到的NameNode是在同一个服务器上的吗?
作者回复: 通常不会
共 2 条评论19 - hunterlodge2018-11-19老师,您给出的Partitioner的代码所反映的算法不会影响集群的扩展性吗?为什么不是采用一致性哈希算法呢?
作者回复: 不会,调用partitioner是一个job的任务分配,动态的,结束了就完成了,不存在扩展性问题。
19 - slam2018-11-15想问下,在Hadoop上跑计算任务,在极端异常的条件下(数据机器down,网络隔离,namenode切换),能保证计算要么返回失败要么给出可信的结果吗?背景是这样的,考量在大数据平台上做资金的清算,非程序的错误,计算结果不能有错有漏,在单机db上这个肯定ok,不考虑事务前提下,Hadoop计算是否也毫无问题?可能考量数据一致性、任务状态一致性等方面,我了解太浅,想请教下老师,这种要求绝对计算准确的场景,hadoop目前胜任吗?展开
作者回复: 没有问题,一般宕机也能计算完成,MapReduce有容错能力。计算结果不会有问题。
19 - 恐龙虾了个皮了个姜哩...2019-09-15看到前边有同学问到shuffle过程为什么不使用一致性hash,感觉老师您的回答没有解决我的疑问,当reduce的机器宕机了的话,如果按照代码中的逻辑是有问题的吧…
作者回复: shuffle时partition的算法不需要解决reduce机器的宕机问题,reduce是一个进程任务,可以启动在任何机器上,任何机器空闲都可以领取这个任务。代码中计算出来的只是任务分区编号,这个时候和机器还没关系呢。
16 - shawn2018-11-19JobTracker创建JobInProcess ,JobinPrcess根据分片数目和设置reduce数目创建TaskInprocess。 那么它是如何决定具体在哪些服务器创建 task tracker呢?我觉得需要了解这个过程,才能明白大数据如何分配和使用资源的。 请老师解答下,谢谢!
作者回复: 所有服务器都启动tasktracker,等待jobtracker分配任务,跟NameNode一样
11 - 金泽2019-01-16“如果 TaskTracker 有空闲的计算资源(有空闲 CPU 核心),JobTracker 就会给它分配任务”,假设极端情况下,某块数据及其备份数据块所在的服务器一直没空闲,那这一块内容是不是就缺失了?
作者回复: 任务是全局分配的,数据块所在服务器没有资源,就会分配给其他服务器计算,其他服务器远程访问数据。任务优先分配能本地得到的数据,但不是必须。
11 - lyuzh2020-04-14老师,您好!一直想不明白一个问题,这里的shuffle过程将map结果中相同的key通过HTTP发送给reduce时这里依然是传递数据呀 以wordcount为例 每个单词map后的结果通过网络传递给reduce时依旧是个耗时操作吧?
作者回复: 是的。 不过,对wordcount而言,map之后,reduce之前,其实还有个combine,在map端做一些本地数据的reduce计算,可以减少传输的数据量。
9 - 滴答2018-11-15map进程快要计算完成的时候将执行分区并发送给reduce进程进行排序和合并,那请问老师map完全计算完成的时候是会再次发送给reduce然后reduce再做排序合并计算吗?那这两部分的排序如何保证整体排序,如果是reduce之后再排序的话那之前排序会不会不需要?
作者回复: 所谓的快完成是指很多个map进程已经完成,一小部分map进程还没完成,这个时候启动shuffle,将完成的map输出发送给reduce,直到所有map都完成
10 - 李慢慢2019-06-12不同的key经过hash计算,也有可能会产生同样的hashcode啊,这种情况怎么处理呢?莫非是跟HashMap一样,搞个链表或者红黑树处理吗?
作者回复: Hashcode只是用来做分区,冲突了分在一起区里没关系,真正对key进行合并的时候还是根据key的值。
共 2 条评论8 - 挨踢菜鸟2018-12-11老师怎么还拿hadoop1举例呢,现在都是hadoop2,以及Yarn了
作者回复: 学习Hadoop1有助于学习yarn,请看后面yarn一期专栏
7