Hadoop之mapreduce程序完整过程解析
其他
2018-11-10 08:40:57
阅读次数: 0
今天在思考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