首先当我在hdfs上存入一个很大的10g文件的时候,首先10g文件会按照128分成80个block,假设我有10个节点,其中一个节点是namenode,那么还有9个节点是datanode,9个节点共同组成了hdfs,80个block放入hdfs时候是随机放入到9个节点的(不太确定,能告诉我吗?),然后按照规则产生副本(这个不说了,网上资料很多)。
mapReduce过程:用户编写的MapReduce程序通过Client提交到JobTracker端 ,JobTracker端获取资源并进行分配,首先会为80个block生成80个map,并且map任务会均匀的分布在各个节点中(这个也不确定,瞎猜的,哈哈),执行map任务时,map会提取想要的block(提取的时候会有相应的原则,如本地化优势,map会优先提取本节点上的数据,如果map所在的节点没有数据会提取其他节点上的,会有网络传输),然后执行map任务,map处理完进行输出,输出到缓冲区,JobTracker再创建reduce(这个task,好像创建map的时候就创建了,不理解为什么这样,不应该是map之后才reduce吗,为什么map task和reduce task一起都创建了,这样不是浪费资源吗,执行maptask的时候 , reduce task 所在的节点不就闲置了吗?有大神解读吗? 还有创建reduce的个数是怎么定的),各个节点上的reduce,会按key的hash值后对Reduce task的数量取模,模相同的放到一个reduce(会有网络传输问题),然后输出到hdfs上
优化方面,1.既然reduce会把相同的key都提取,为什么在切分的时候不把相同的key切分到一个map里,只有在reduce的时候,就不需要网络传输了
2.为什么在shuffle的过程中,进行各种排序,这个不是浪费时间吗,有什么实际的意义吗
求大神指点