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处理;
(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
- MapReduce原理(2)
- MapReduce原理浅析(转)
- mapreduce原理(word count)
- mapreduce(六):MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- mapreduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- MapReduce原理
- nios starter : generation skipped because the system has validation errors
- 64操作系统PLSQL---32位oracle客户端
- 学习Android编程的一些感想
- 开源地址
- UDP协议及包格式
- MapReduce原理(2)
- skype
- This device is not currently connected
- 新年第二天
- uhttpd的实现框架
- iOS6 Grouped类型UITableView背景色设置问题
- C++ API函数
- Selenium 3 之路
- 对别人有帮助的文章对别人有帮助的文章