首页 > 代码库 > mapreduce的理解

mapreduce的理解

1.自己设计一个并行计算框架,应该需要考虑那些问题呢?

第一个问题是:并行计算肯定是多台计算机吗,多台计算机他们之间如何划分任务?

这个地方总归有一个模块来分发任务,也就意味这它就是老大,它来维护任务或者资源

mapreduce在hadoop 1.x版本上是jobtracker,hadoop 2.x版本是通过yarn来管理的,它是ResourceManager,来管理其他节点以及如何分布任务的。

小弟在Hadoop 1.x版本上是tasktracker,在hadoop2版本上是NodeManager,NodeManager在启动一个进程YARNchild来运行处理计算数据。

第二个问题是:并行计算所需的计算数据从哪里来?

一个任务很大,如果都让放在老大那边,是不是压力很大吗?所以他们使用现成的可以存储数据的hdfs来负责存储数据,客户端向ResourceManager得到任务允许之后,然后将所需jar包,依赖都放在hdfs节点上,让他们自己都去取所需任务,老大只要告诉他们一定的标志就可以了吗。

第三个问题是:并行计算计算出来的结果,如何进行汇总?

并行计算计算出来的数据,最终还是写给了hdfs,不可能写给老大,老大可能还要连续接受别人给的新任务,也不可能放在每个节点上,这样数据过于离散,最后还是选择了继续放在hdfs上。

第四个问题是:如何在这个过程中有的任务失败了,会想什么办法来弥补呢?

他们通过rpc通信,(也就是所谓的心脏跳动机制,来时不时给老大反馈,)老大在让其它nodeManager来继续干这些事情,来弥补计算。

2.mapreduce的运行流程是什么?

                                                        client                  

                        

                                                        jobtracker


                inputsplit            ->mapper()  

                                                                    mapoutput  ----shuffle---reducer()  ------>output

                inputsplit            ->mapper()


inputsplit:一个inputsplit对应这一个map函数   :也就一行作为一个mapper函数来处理。

mapper输出[hello    1] [zhang 1] [san 1]

shuffle:对起所需结果,进行分组。如hello 一组,[hello, (1,1,1)]

reduceer:输出 hello 5

                        zhangsan 1


hadoop中数据要在网络之间传输,必须实现序列化(先将文件写到磁盘中,在从磁盘中在经过网络传输)

Hadoop使用自己的高效序列化机制来代替Java版的序列化机制(string,long等都实现seriable),

hadoop序列化机制必须实现writable接口。





本文出自 “简答生活” 博客,转载请与作者联系!

mapreduce的理解