Hadoop MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。早期的MapReduce(MR)框架简单明了,JobTracker作为MR框架的集中处理点,随着分布式系统集群的规模和其工作负荷的增长,显得力不从心:
1. JobTracker 存在单点故障。
2. JobTracker 任务重,资源消耗多,当MR任务非常多的时候,会造成很大的内存开销,增加了 JobTracker fail 的风险,业界总结出旧MR框架只能支持 4000节点主机的上限。
3. 在TaskTracker端,以MR任务的数目表示资源过于简单,没有考虑CPU和 内存的占用情况,如果两个大内存消耗的任务被调度到了同一个TaskTracker,很容易出现 OOM。
4. TaskTracker端,把资源强制划为 Map task slot和Reduce task slot, 当系统中只有Map task或只有Reduce task时,会造成资源浪费。
5. 源代码难读,bug 修复和版本维护的难度大。
6. 不易维护,MR框架会强制进行系统级别的升级更新,让分布式集群系统的每一个用户端同时更新。这些更新会让用户为了验证他们之前的应用程序是不是适用新版本而浪费大量时间。
为从根本上解决旧 MR框架的性能瓶颈,促进 Hadoop的长远发展,从0.23.0版本开始,Hadoop 的MR框架完全重构,新的MR基于YARN 进行数据处理。
重构根本的思想是将JobTracker的资源管理和任务调度&监控功能分离成单独的组件,ResourceManager 和ApplicationMaster 。
ResourceManager实现了以前JobTracker的一些功能,控制整个集群并管理资源的分配,包含两个组件:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。
ApplicationMaster承担了TaskTracker的功能,主要职责为向调度器索要适当的资源容器,运行任务,跟踪应用程序的状态和监控它们的进程,处理任务的失败原因。ApplicationMaster并不是一个物理节点,用户提交的每一个任务中均包含一个ApplicationMaster,可将其视为用户在创建业务代码时实现的任务框架。
NodeManager负责管理YARN 集群中的每个节点,提供针对集群中每个节点的服务。它是应用程序的容器,监控应用程序的资源使用情况 (CPU&内存&硬盘&网络)并且向调度器汇报。
YARN调度MR任务的流程如下图所示:
一个完整的MR任务大体分为Map和Reduce两个阶段,部分任务可能会增加Combiner阶段,MR任务的数据在执行中会被封装成键值对(key, value)的格式,且数据均需实现框架提供的序列化(*Writable)接口。下例以WorldCount为例详述MR具体过程。
Map阶段完成对数据的拆分,具体数据处理方式由业务逻辑决定。上例中的Map将按行读入的数据进行分词计数,并将结果封装成<k2, v2>。
Reduce阶段实现数据的整合过程,对Map的输出按业务整合。上例中主要实现对v3的求和,将结果封装成<k4, v4>,其中<k3, v3>需与<k2, v2>的数据类型保持一致。
在Hadoop这样的集群环境中,大部分Map任务与Reduce任务的执行是在不同的节点上,数据在传输的过程中存在大量的IO操作(本地IO及网络传输),必然要对数据进行序列化和反序列化。序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。MR基础的序列化数据类型有IntWritable、Text等,还为用户提供了Writ