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上,放在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
序列化讲解:
序列化可以将内存中的类写入文件或数据库中。比如将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。(objectinputstream这个类就是干这个用的)。对象、文件、数据,有许多不同的格式,很难统一传输和保存
序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。
hadoop中数据要在网络之间传输,必须实现序列化(将内存中对象以流的形式写给其他节点)
Hadoop使用自己的高效序列化机制来代替Java版的序列化机制(string,long等都实现seriable),
hadoop序列化机制必须实现writable接口。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/191896.html