Hadoop之mapreduce程序完整过程解析

今天在思考mapreduce程序运行的过程时,发现对这块有点乱,所以总结一下,hadoop下运行mapreduce程序的详细过程··· ···

首先在运行一个mapreduce程序时,必须启动相应的服务,也就是各个节点:

1.Hadoop中hdfs的两个节点:NameNode、DataNode。

2.Hadoop中yarn的两个节点:ResourceManager、NodeManager。

              各个节点的功能请参照我的另一篇博客:

              https://blog.csdn.net/superme_yong/article/details/83004140 

3.Hadoop的历史服务器:JobHistoryServer(也可以不启动,它实现了web查看作业的历史运行情况)。

            4个进程的启动命令:
            sbin/hadoop-daemon.sh start namenode
            sbin/hadoop-daemon.sh start datenode
            sbin/yarn-daemon.sh start resourcemanager
            sbin/yarn-daemon.sh start nodemanager

            历史服务器启动命令:mr-jobhistory-daemon.sh start historyserver
开始执行程序:

1.用户先向jar包提交给yarn,yarn资源管理器向ResourceManager提交申请

2.ResourceManager接受请求,随机选择一台NodeManager节点启动AppMaster

3.AppMaster联系NodeManager启动相关Task

4.NodeManager开始从指定位置拉取需要处理的数据,默认从hdfs中读取数据,它读取的文件每一行转成key    Value的形式(key:行偏移量、value:行内容)。

5.Map操作:

MapTask开始执行Map任务:

        每一行调用一次map方法:

              map 方法:对每一行数据进行处理、构建新的keyValue

              PS:这里的map方法由你的业务决定.

6.shuffle操作:

       首先了解下什么是shuffle:Shuffle描述着数据从map task输出到reduce task输入的这段过程。

所以shuffle的过程可以简单的分为两步:

一.Map端的shuffle:

当map执行完成后,数据会被输入到一个环形缓冲区域,进行map端的shuffle过程,具体操作如下:

              注意:数据操作完成之后还在maptask中。

 分区:根据key的hash值对reduce个数取余就是它的分区数。

 排序:相同分区的数据放在一起并按照字典排序

 溢写:缓冲区的大小是有限的,当达到阈值80%开始溢写到磁盘,生成多个小文件

 合并:显然小文件不利于之后的操作,所以它会将所有的小文件合并成一个大文件

 排序:将所有小文件中相同分区的数据放在一起并排序

         maptask执行完毕后会将执行结果通知给AppMaster,并销毁自己。

二.Reduce端的shuffle:

当maptask执行结束后,AppMaster会通知ReduceTask,reducetask会从maptask端拉取属于自己分区的数据,具体操作如下:

合并排序:将多个MapTask的结果进行合并并排序。

        分组:按照key的类型,将相同key的value放在一起 。

以wordcount为例:

<key(单词),list<1,1,1>(将出现的次数放入集合中,以元素的方式存储)>  

7.Reduce操作:

       reducetask开始执行reduce任务:

                对每一种key调用一次reduce方法:

                reduce方法:实现聚合或者其他操作、封装新的keyValue

8当所有reduce方法结束后,reducetask会通知appmaster运行结果,并销毁自己。

最后appmaster将运行的结果通知给ResourceManager,并注销自己,之后ResourceManager向用户反馈执行的结果信息。

               

猜你喜欢

转载自blog.csdn.net/superme_yong/article/details/83314775