MapReduce错误处理,任务调度及Shuffle过程,mapreduceshuffle


错误处理

出现错误主要有以下三种:
1、Task任务
2、JobTracker失败
3、TaskTracker失败

Task任务

1、当map或者reduce子任务中的代码抛出异常,JVM进程会在退出之前向服务tasktracker进程发送错误报告,tasktracker会将此(任务尝试)taskattempt标记为failed状态,释放一个槽以便运行另外一个任务

2、对于流任务,如果流进程以非零退出运行,则会标记为failed。

3、子JVM突然退出(JVM错误),这时tasktracker会注意到进程己经退出,标记为failed。

4、tasktracker将子任务标记为失败后会将自身计数器减一,以便向jobtracker申请新的任务,也是通过心跳告知jobtracker本地的一个任务尝试失败。

5、jobtracker接到任务失败的通知后,会将其重新加入到调度队列重新分配给其他的tasktracker执行(避免将失败的任务分配给执行失败的tasktracker),但是这个尝试也是有次数限制的,默认情况卜任务尝试4次后仍然没有完成,就不会再重试(jobtracker会将其标记为killed),此时整个作业就执行失败了。

TaskTracker失败

1、tasktracker一旦失败,就会停止向jobtracker发送心跳。

2、同时jobtracker从任务池中将此tasktracker删除,tasktracker上运行的任务将会被移送到其他tasktracker节点上去运行。

3、如果每个tasktracker上面的任务失败次数远远高于其他节点,jobtracker就把该tasktracker放入到黑名单中。

4、如果成功完成的map任务,tasktracker节点已经失效了,那么reduce任务也无法访问到存储在tasktracker本地文件系统上的中间结果,需要在其他tasktracker节点重新被执行。

JobTracker失败

1)JobTracker失败是最严重的一种失败方式了,而在Hadoop1.x中存在单点故障的情况下是相当严重的。

2)可以通过启动多个JobTracker,在这种情况只运行一个主的jobtracker,主的jobtracker由zookeeper协调控制。但是出现故障的概率仍然比较高,因此,Hadoop2.x采用了一种全新的架构Yarn。将作业调度和任务管理完全剥离出来。

作业调度

先进先出调度器(FIFO)默认方式
公平调度器(FairScheduler)
容量调度器(CapacityScheduler)

先进先出调度器(FIFO)

1、FIFO调度器是hadoop中默认的调度器,它先遵循优先级优先,然后按照作业到来的顺序进行调度

2、这种默认的调度器的一个缺点是:高优先级以及需要长时间运行的作业一直在被处理,而低优先级以及短作业将长时间得不到调度。

公平调度器(FairScheduler)

由fackbook开发的调度器。
1、FairScheduler的目标是让每个用户公平的共享集群
2、作业被放在池中,在默认情况下,每个用户都有自己的池。
3、支持抢占,如果一个池在特定的时间内未得到公平的资源分配,调度器就会终止运行池中得到过多的资源的任务,以便把任务槽让给资源不足的池。

容量调度器(CapacityScheduler)

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

配置FairScheduler

1、修改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>

2、fair-scheduler.xml
以上是hadoop1.x的相关操作。

hadoop2.x对yarn-site.xml进行配置可以参考官网
http://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

Hadoop YARN 附带的默认调度器是CapacityScheduler。

shuffle和sort

map端

1、map端并不是简单的把中间结果写入到磁盘,而是利用环形缓冲区的方式先把map输出到内存当中。

2、每个map都有一个环形缓冲区,默认大小100M,大小可以由属性io.sort.mb来修改。

3、一旦内存缓冲区达到一个溢写阀值。(io.sort.spill.percent),就会新建一个溢写文件

4、多个溢写文件最终会合并成一个己分区已排序大的输出文件,写入到磁盘中,作为reduce的输入。

5、io.sort.factor控制着一次最多可以合并多少个分区。

reduce端

1、reduce端shuffle过程,分为三个阶段:复制map输出、排序合并和reduce处理。
2、由于reduce可以接收多个map的输出,所以复制map输出阶段的时候仍然需要在本地排序并合并。

3、map任务可以在不同时间完成,囚此只要有一个map任务结束,reduce任务就开始复制其输出。

4、reduce任务有少量的复制线程,可以并行取得map输出。
mapred.reduce.parallel.copies属性来控制)

5、reduce处理阶段不会等待所有输入合并成一个大文件后进行处理,而是把部分合并后的结果直接进行处理

相关内容