Hadoop必知必会——重要部分整理
Posted Z-hhhhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop必知必会——重要部分整理相关的知识,希望对你有一定的参考价值。
一、hadoop mapreduce工作原理
1、在MapReduce程序读取文件的输入目录上存放相应的文件。
2、客户端程序在submit()方法执行前,获取待处理的数据信息,然后根据集群中的参数配置形成一个任务分配规划。
3、客户端提交切片信息给Yarn,Yarn中的resourcemanager启动MRAPPmaster。
4、MrAPPmaster启动后根据本次job的描述信息,计算出需要maptask实例对象,然后向集群申请机器启动相应数量的maptask进程。
5、Maptask利用客户端指定的inputformat来读取数据,形成KV键值对。
6、Maptask将输入的KV键值对传递给客户定义的map()方法,做逻辑运算。
7、Map()方法运算完毕后将KV对收集到maptask缓存。
8、shuffle阶段
8.1、maptask收集map()方法输出的KV对,放到环形缓冲区中。
8.2、maptask中的KV对按照K分区排序,并不断的一些到本地磁盘文件,可能会溢出很多小文件。
8.3、多个小文件会被合并成大的溢出文件。
8.4、在溢写过程中,及合并过程中,都会不停的进行分区和针对Key的排序操作。
8.5、Reducetask根据自己的分区号,去各个maptask机器上获取相应的结果分区数据。
8.6、Reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行归并排序。
8.7、合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中去除一个一个的键值对进行group,调用用用户自定义的reduce()方法)。
9、MrAPPmaster监控到所有的maptask进程任务完成后,会进去客户端指定的参数启动相应数量的reducetask进行,并告知reducetask进行要处理的数据分区。
10、reducetask进程启动后,根据MrAPPmaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取若干maptask输出结果文件,并再本地进行重新归并排序。然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算。
11、reducetask运算完毕后,调用客户指定的outputformat将结果数据输出到外部。
二、MR的shuffle阶段的工作流程
shuffle是MapReduce的核心,它分布在MapReduce的Map阶段和reduce阶段。一般把从Map产生储出开始到Reduce取得数据作为输入之间的过程称之为shuffle。
shuffle阶段分为四个步骤:分区、排序、规约、分组,其中前三步骤是在map阶段完成的,最后的分组时在reduce阶段完成。
1、collect阶段
将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,partition分区信息等。
2、spill阶段
当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
3、Merge 阶段
把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
4、Copy阶段
ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5、Merge阶段
在ReduceTask远程复制数据的同时,会在后台开启两个线程(一个是内存到磁盘的合并,一个是磁盘到磁盘的合并)对内存到本地的数据文件进行合并操作。
6、Sort阶段
在对数据进行合并的同时,会进行排序操作,由于MapTask 阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可
三、hadoop job的执行流程
一、作业提交
(1)client 向整个集群提交job,向 ResourceManager 申请一个jobid。
(2)ResourceManager 给 client 返回该 job 资源的提交路径和作业 id。
(3)client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
(4)client 提交完资源后,向 ResourceManager 申请运行 MrAppMaster。
二、作业初始化
(5)当 ResourceManager 收到 client 的请求后,将该 job 添加到容量调度器(ResourceScheduler)中。
(6)调度器会将任务放在调度队列种,当执行到相应的请求时,某一个空闲的 NodeManager 领取到该 job。
(7)该 NodeManager 创建 Container,并产生 MRAppmaster。
(8)MRAppmaster获取hdf上提交的文件,根据切片信息创建Maptask和Ruducetask。
三、任务分配
(9)MrAppMaster 向 ResourceManager 申请运行多个 maptask 任务资源。
(10)ResourceManager将运行 maptask 任务分配给另外两个 NodeManager,另两个 NodeManager分别领取任务并创建容器。
四、任务运行
(11)MrAppMaster向两个接收到任务的 NodeManager 发送程序启动脚本,这两个NodeManager 分别启动 maptask,maptask 对数据分区排序。
(12)MrAppMaster 等待所有 maptask 运行完毕后,向 ResourceManager 申请容器,运行 reduce task。
(13)reduce task 向 maptask 获取相应分区的数据。
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MrAppMaster 会向 ResourceManager 申请注销自己。
五、进度和状态更新
YARN 中的任务将其进度和状态(包括 counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新, 展示给用户。
六、作业完成
除了向应用管理器请求作业进度外, 客户端每 5 分钟都会通过调用 waitForCompletion()来检查作业是否完成。时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。作业完成之后, 应用管理器和 container 会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
以上是关于Hadoop必知必会——重要部分整理的主要内容,如果未能解决你的问题,请参考以下文章