MapReduce详解:
1)特点:
1)开发简单。
2)可扩展性强,增加节点即可。
3)容错性强。
2)短板:执行速度慢,因为有大量的中间结果需要对磁盘进行I/O,还得通过网络进行传输。
3)MapReduce作业运行机制:
1)客户端:提交MapReduce作业。
2)jobtracker:协调作业的运行。
3)tasktracker:运行作业划分后的任务。
4)相关概念:
MapReduce作业(job)是用户提交的最小单位,Map任务、Reduce任务(task)是MapReduce计算的最小单位。
1)作业的提交:
JobClient的submitJob()方法所实现的作业提交过程:
1 向jobtracker请求一个新的作业ID(通过调用JobTracker的getNewJobId()方法获取)
2 检测作业的输出说明。例如:如果没有指定输出目录或输出目录已经存在,作业就不提交,并向MapReduc程序抛出错误
3 计算作业的输入分片。例如:如果输入路径不存在,则无法计算分片
4 将运行作业所需要的资源(包括作业jar文件、配置文件和计算所得的输入分片)复制到一个以作业ID命名的目录下jobtracker的文件系统中。
作业jar的副本较多(由mapred.submit.replication属性控制,默认为10),故在运行作业的任务时,集群中有很多副本可供tasktracker访问。
5 告知jobtracker作业准备执行(通过调用JobTracker的submitJob()方法实现)
2)作业的初始化:
当JobTracker接受到对其submitJob()方法的调用后,会把此调用放入一个内部队列中,交由作业调度器(job scheduler)进行调度,并对其进行初始化。
初始化过程:创建一个表示正在运行作业的对象--封装任务和记录信息,以便跟踪任务的状态和进程。
3)任务的分配:
tasktracker运行一个简单的循环来定期发送“心跳(heartbeat)”给jobtracker,jobtracker使用心跳的返回值与tasktracker进行通信。
jobtracker给tasktracker分配reduce任务和map任务:
选择reduce任务:jobtracker简单地从待运行的reduce任务列表中选一个reduce任务,而不用考虑数据的本地化。
选择map任务:jobtracker会考虑tasktracker的网络位置,并选取一个距离其输入分片文件最近的tasktracker。最理想的情况是任务运行在输入分片所在的节点上。
4)任务的执行:
通过从共享文件系统把作业的jar文件复制到tasktracker所在的文件系统,从而实现作业的jar文件本地化,同时,tasktracker将应用程序所需要的全部文件从分布式缓存复制到本地磁盘。
tasktracker为任务新建一个本地工作目录,并把jar文件中的内容解压到这个文件夹下。
tasktracker新建一个TaskRunner实例来运行该任务。
Tasktracker启动一个新的JVM来运行每个任务,以确保用户自定义的map函数和reduce函数中存在的问题不会影响到tasktracker。
5)任务的失败:
子任务失败:
1)map或reduce任务中的用户代码抛出运行异常:
处理策略:子任务JVM进程会在退出之前向其父tasktracker发送错误报告,错误报告最后被记入用户日志。tasttracker会将此次tast attempt标记为failed,并释放一个任务槽运行另外一个任务。
2)子进程JVM突然退出:由于JVM的bug而导致MapReduce用户代码产生一些错误,而导致JVM 退出。
处理策略:tasktracker会注意到进程已经退出,并将此次tast attempt标记为failed。
3)任务挂起:一旦tasktracker注意到已经有一段时间没有收到进度的更新,便会将任务标记为failed,在此之后,JVM子进程将被自动杀死。
tasktracker失败:tasktracker由于奔溃或运行过于缓慢而失败,并停止向jobtracker发送心跳。
jobtracker失败:jobtracker失败是一个单点故障,故作业注定会失败。
MapReduce详解
最新推荐文章于 2024-09-19 17:35:00 发布