MapReduce详解

来源:互联网 发布:《算法统宗》甲牵一只 编辑:程序博客网 时间:2024/06/07 15:13
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失败是一个单点故障,故作业注定会失败。

0 0
原创粉丝点击