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接口。