首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MapReduce之任务执行与作业调度

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[15]篇文章,欢迎阅读和收藏】

1基本概念

MapReduce是一种可用于数据处理的编程框架。MapReduce 采用 " 分而治之 " 的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说, MapReduce 就是 " 任务的分解与结果的汇总 " 。

在分布式计算中, MapReduce 框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map 和 reduce , map 负责把任务分解成多个任务, reduce 负责把分解后多任务处理的结果汇总起来。

一个 MapReduce 作业的生命周期大体分为 5 个阶段:作业提交与初始化、任务调度与监控、任务运行环境准备、任务执行、作业完成。

2术语解释

(1)TaskTracker

TaskTracker是 JobTracker 和 Task 之间的桥梁,一方面,从 JobTracker 接收并执行各种命令:运行任务、提交任务、杀死任务等;另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给 JobTracker 。

3详细说明

3.1MapReduce任务运行

3.1.1推测执行

所谓推测式执行是指当作业的所有任务都开始运行时, JobTracker 会统计所有任务的平均进度,如果某个任务所在的 TaskTraker 节点由于配置比较低或 CPU 负载过高,导致任务执行的速度比总体任务的平均速度要慢,此时 JobTracker 就会启动一个新的备份任务,原有任务和新任务哪个先执行完就把另外一个 kill 掉,这就是经常在 JobTracker 页面看到任务执行成功,但是总有些任务被 kill 掉的原因,

MapReduce将待执行作业分割成一些小任务,然后并行处理这些任务,提高作业运行的效率,使作业的整体执行时间小于顺序执行时间。但很明显,运行缓慢的任务将成为 MapReduce 的瓶颈。因为只要有一个运行缓慢的任务,整个作业的完成时间将被大大延长。这个时候就需要采用推测式来避免出现这种情况。

3.1.2任务JVM重用

不论是 Map 任务还是 Reduce 任务,都是在 TaskTracker 节点上的 java虚拟机( JVM )中运行。当 TaskTracker 被分配一个任务时,就会在本地启动一个新的 JVM 来运行这个任务。对于有大量零碎输入文件的 Map 任务而言,为每一个 Map 任务启动一个 JVM 这种做法显然还有很大的改善空间。如果在一个非常短的任务结束之后让后续的任务重用此 JVM ,这样就可以省下新任务启动新的 JVM 的时间,这就是所谓的任务 JVM 重用。需要注意的是,虽然一个 TaskTracker 上可能会有多个任务在同时运行,但这些正在执行的任务都是在相互独立的 JVM 上。

3.2MapReduce作业调度

JobClient的 runJob() 方法:新建 JobClient 实例,并调用其submitJob() 方法。提交作业后, runJob() 每秒轮询作业进度,如果发现上次上报后信息有改动,则把进度报告输出到控制台。作业完成,成功则显示作业计数器;失败则输出错误到控制台。

3.2.1 JobClient的submitJob()的作业提交过程

( 1 )向 JobTracker 请求一个新 jobID ,通过 JobTracker 的 getNewJobId() 获取;

( 2 )检查作业输出说明。例如,如果没有指定输出目录或者已经存在,作业将不会被提交,错误返回给 MR 程序;

( 3 ) 计算作业输出划分 split 。如果划分无法计算( eg. 输入路径不存在),作业将不会被提交,错误返回给 MR 程序;

( 4 )将运行作业所需要的资源(作业的 jar 文件、配置文件、计算所得的输入划分)复制到一个以作业 ID 命名的目录中 JobTracker 的文件系统。如果作业 jar 的副本很多,在 TaskTracker 运行作业任务时,集群可以提供多副本访问(图中 step3 );

( 5 )通过调用 JobTracker 的 submitJob() 方法,告诉 JobTracker 作业准备执行(图中 step4 );

( 6 ) JobTracker 接收到 submitJob() 方法调用后,把此调用放到一个内部队列中,交由作业调度器进行调度,并对其进行初始化(包括创建一个代表该正在运行的作业对象,负责封装任务和记录信息,以便跟踪任务的状态和进程)。(图中 step5 )

( 8 ) TaskTracker 执行一个简单的循环,定期发送心跳( heartbeat )调用 JobTracker ,心跳告诉 JobTrackder 是否存活以及充当消息通道。(图中 step7 )

3.2.2TaskTracker分配任务之后的任务运行过程

( 1 )作业 JAR 文件本地化:从共享文件系统复制到 TaskTracker 。并且应用程序全部文件从分布式缓存复制到本地磁盘;

( 2 )为任务新建一个本地工作目录, JAR 文件内容会被解压到此目录;

( 3 )新建一 TaskRunner 实例运行此任务。TaskRunner 启动一个新的 JVM (图中 step9-10 )来运行每个任务。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191215A0KQ3400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券