MapReduce原理(2)

来源:互联网 发布:外贸邮件软件小满 编辑:程序博客网 时间:2024/05/22 03:16
一、错误处理
出现的错误主要有以下三种:
(1)Task失败
   ①当map或者reduce子任务中的代码抛出异常,JVM进程会在退出之前向主进程tasktracker进程发送错误报告,tasktracker会将此(任务尝试)task attempt标记为failed状态,释放一个槽以便运行另外一个任务;

   ②对于流任务,如果流进程以非零退出运行则会标记为failed;
   ③子JVM突然退出(JVM错误),这时tasktracker会注意到进程已经退出,标记为failed;
   ④tasktracker将子任务标记为失败后会将自身计数器减一,以便向jobtracker申请新的任务,也是通过心跳告知jobtracker本地的一个任务尝试失败;
   ⑤jobtracker接到任务失败的通知后,会将其重新加入到调度队列重新分配给其他的tasktracker执行(避免将失败的任务分配给执行失败的tasktracker),但是这个尝试也是有次数限制的,默认情况下任务尝试4次后仍然失败没有完成,就不会再重试(jobtracker会将其标记为killed),此时整个作业就执行失败了。


(2)TaskTracker失败
    ①tasktracker一旦失败,就会停止向jobtracker发送心跳;
    ②同时jotracker从任务池中将此tasktracker删除,tasktracker上运行的任务将会被移送到其他tasktracker节点上去运行;
    ③如果每个tasktracker上面的任务失败次数远远高于其他节点,jobtracker就把该tasktracker放入到黑名单中;
    ④如果成功完成map任务,那么reduce任务也无法访问到存储在tasktracker本地文件系统上的中间结果,需要重新被执行;


(3)JobTracker失败
    ①jobtracker失败是最严重的一种失败方式,而且在Hadoop中存在单点故障的情况下是相当严重的;
    ②可以通过启动多个jobtracker,在这种情况下只运行一个主的jobtracker,主的jobtracker由zookeeper协调控制;

二、作业调度:
(1)先进先出调度器(FIFO)
   ①FIFO调度器是hadoop种默认的调度器,它先遵循优先级优先,然后按照作业到来的顺序进行调度;
   ②这种默认的调度器的一个缺点是:高优先级以及需要长时间运行的作业一直在被处理,而低优先级以及短作业将长时间得不到调度;

(2)公平调度器(Fair Scheduler)
   ①Fair Scheduler的目标是让每个用户公平的共享机器;
   ②作业被放在池中,在默认情况下,每个用户都有自己的池;
   ③支持抢占,如果一个池在特定的时间内未得到公平的资源分配,调度器就会终止运行池中得到过多的资源的任务,以便把任务槽让给资源不足的池;


(3)容量调度器(Capacity Scheduler)
   ①支持多个队列,每个队列可以配置一定的资源量,每个队列采用FIFO调度策略;
   ②为了防止同一个用户提交的作业独占队列中的资源,对同一个用户提交作业所占的资源量进行限定;
   ③具有的特性:层次化的队列、资源容量保证、安全性、弹性、可操作性、基于资源的调度;

配置Fair Scheduler:
①修改mapred-site.xml:
<property>    <name>mapred.jobtracker.taskScheduler</name>    <value>org.apache.hadoop.mapred.FairScheduler</value></property><property>    <name>mapred.fairscheduler.allocation.file</name>    <value>$HADOOP_HOME/conf/fair-scheduler.xml</value></property>





三、shuffle和sort:



map端:
(1)map端并不是简单的把中间结果写入到磁盘,而是利用缓冲的方式先把map输出的结果输出到内存;
(2)每个map都有一个环形缓冲区,默认大小100M,大小可以由属性io.sort.mb来修改;
(3)一旦内存缓冲区达到一个溢写阈值(io.sort.spill.percent),就会新建一个溢写文件;
(4)多个溢写文件最终会合并成一个已分区已排序的输出文件,作为reduce的输入;
(5)io.sort.factor控制着一次最多可以合并多少个分区;
源码见org.apache.hadoop.mapred.MapTask类,其中sortAndSpill()方法;

reduce端:
(1)reduce端shuffle过程,分为三个阶段:复制map输出,排序合并和reduce处理;
(2)由于reduce可以接受多个map的输出,所以复制map输出阶段的时候仍然需要在本地排序与合并;
(3)map任务可以在不同时间完成,只要有一个map任务结束,reduce任务就开始复制其输出;
(4)reduce任务有少量的复制线程,可以并行取得map输出(mapred.reduce.parallel.copies属性来控制);
(5)reduce处理阶段不会等待所有所有输入合并成一个大文件后进行处理,而是把部分合并后的结果直接进行处理;
源码见org.apache.hadoop.mapred.ReduceTask类,其中run方法;
参考:http://dirlt.com/hadoop.html

shuffle过程说的不够详细,还看这里吧:http://langyu.iteye.com/blog/992916
0 0
原创粉丝点击