首先我要将一个200M文件存到HDFS集群中。
如果在传输的时候,有的DataNode宕机了,这个DataNode就会从这个管道中退出。剩下的DataNode继续传输。然后,等传输完成以后,NameNode会再分发出一个节点,去写成功的DataNode上复制出一份Block块,写到新的DataNode上。
1.在HDFS存好文件后,当开始MapReduce的计算时首先通过FileInputFormat先扫描切片,每次扫描一行数据,调用RecordReader类中的getCurrentKey()、getCurrentValue()返回一个key(行偏移量),value(每行的内容)。context将返回的key和value带入到MapTask中,让map方法去进行处理。
切片的计算:long splitSize = Math.max(minSize, Math.min(maxSize, blockSize));每个切片的大小可以自定义但是为了优化效率 默认将切片的大小与HDFS的分割的block的大小一致
2.map方法处理完以后,将处理后的key、value进行序列化,写入到环形缓冲区中。(默认是100M)。当环形缓冲区到达80%以后,就会将里面的内容进行溢写。溢写的时候会进行分区,并默认按照key的hashcode值,对reduceTask进行取余。根据余数相同的分到一个分区中。在分区时还会进行排序,默认按字典顺序。使用快速排序。Key -> key的hashcode ->根据reduceTask的个数取余->根据取余的结果进行分区。
3.在MapTask结束的时候,会将相同分区的数据聚合到一块。并进行排序,使用归并排序。MapTask自此结束。
4.Reduce端会将map端处理完以后的文件,相同分区的拉取到一块。进行合并和排序,归并排序。一个ReduceTask去处理一个分区的数据。
5.ReduceTask会根据相同的key分组,key相同的数据被分为了一组。一组数据去调用一次reduce方法。一个reduceTask处理完以后写入到一个reduceTask文件中。
1.Shuffle:从数据进入缓冲区开始到reducetask调用reduce方法之前。
客户端将它的程序提交给Yarn。
RM会给客户端返回一个jobid以及一个路径。
客户端会将对应的程序信息(jar包、切片信息、序列化文件)提交到对应的路径下。
提交完以后给RM返回一个确认。
RM就会在存放提交信息的那台NodeManager上创建出来一个容器。启动我们的ApplicationMaster。
ApplicationMaster会跟提交的切片信息和程序向RM注册,并申请容器。
RM收到资源请求后,就去跟NM通信,NM就会在自身的节点上创建出需要的容器数量。
ApplicationMaster就将相应的任务信息,发送到对应的NM节点上,并使用创建出来的container去运行Task。
运行ReduceTask。
等所有的Task都执行完以后,ApplicationMaster就向RM进行注销,RM就会回收资源。
Hadoop基础——HDFS、MapReduce、Yarn的运行原理和机制
原文:https://www.cnblogs.com/wuxuewei/p/11429546.html