您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > hadoop1.x和hadoop2.x的区别
Hadoop1.x和hadoop2.x的区别Hadoop1.0中的资源管理方案Hadoop1.0指的是版本为ApacheHadoop0.20.x、1.x或者CDH3系列的Hadoop,内核主要由HDFS和MapReduce两个系统组成,其中,MapReduce是一个离线处理框架,由编程模型(新旧API)、运行时环境(JobTracker和TaskTracker)和数据处理引擎(MapTask和ReduceTask)三部分组成。Hadoop1.0资源管理由两部分组成:资源表示模型和资源分配模型,其中,资源表示模型用于描述资源的组织方式,Hadoop1.0采用“槽位”(slot)组织各节点上的资源,而资源分配模型则决定如何将资源分配给各个作业/任务,在Hadoop中,这一部分由一个插拔式的调度器完成。Hadoop引入了“slot”概念表示各个节点上的计算资源。为了简化资源管理,Hadoop将各个节点上的资源(CPU、内存和磁盘等)等量切分成若干份,每一份用一个slot表示,同时规定一个task可根据实际需要占用多个slot。通过引入“slot“这一概念,Hadoop将多维度资源抽象简化成一种资源(即slot),从而大大简化了资源管理问题。更进一步说,slot相当于任务运行“许可证”,一个任务只有得到该“许可证”后,才能够获得运行的机会,这也意味着,每个节点上的slot数目决定了该节点上的最大允许的任务并发度。为了区分MapTask和ReduceTask所用资源量的差异,slot又被分为Mapslot和Reduceslot两种,它们分别只能被MapTask和ReduceTask使用。Hadoop集群管理员可根据各个节点硬件配置和应用特点为它们分配不同的mapslot数(由参数mapred.tasktracker.map.tasks.maximum指定)和reduceslot数(由参数mapred.tasktracker.reduce.tasks.maximum指定)。Hadoop1.0中的资源管理存在以下几个缺点:1)静态资源配置。采用了静态资源设置策略,即每个节点实现配置好可用的slot总数,这些slot数目一旦启动后无法再动态修改。2)资源无法共享。Hadoop1.0将slot分为Mapslot和Reduceslot两种,且不允许共享。对于一个作业,刚开始运行时,Mapslot资源紧缺而Reduceslot空闲,当MapTask全部运行完成后,Reduceslot紧缺而Mapslot空闲。很明显,这种区分slot类别的资源管理方案在一定程度上降低了slot的利用率。3)资源划分粒度过大。这种基于无类别slot的资源划分方法的划分粒度仍过于粗糙,往往会造成节点资源利用率过高或者过低,比如,管理员事先规划好一个slot代表2GB内存和1个CPU,如果一个应用程序的任务只需要1GB内存,则会产生“资源碎片”,从而降低集群资源的利用率,同样,如果一个应用程序的任务需要3GB内存,则会隐式地抢占其他任务的资源,从而产生资源抢占现象,可能导致集群利用率过高。4)没引入有效的资源隔离机制。Hadoop1.0仅采用了基于jvm的资源隔离机制,这种方式仍过于粗糙,很多资源,比如CPU,无法进行隔离,这会造成同一个节点上的任务之间干扰严重。Hadoop2.0中的资源管理方案Hadoop2.0指的是版本为ApacheHadoop0.23.x、2.x或者CDH4系列的Hadoop,内核主要由HDFS、MapReduce和YARN三个系统组成,其中,YARN是一个资源管理系统,负责集群资源管理和调度,MapReduce则是运行在YARN上离线处理框架,它与Hadoop1.0中的MapReduce在编程模型(新旧API)和数据处理引擎(MapTask和ReduceTask)两个方面是相同的。让我们回归到资源分配的本质,即根据任务资源需求为其分配系统中的各类资源。在实际系统中,资源本身是多维度的,包括CPU、内存、网络I/O和磁盘I/O等,因此,如果想精确控制资源分配,不能再有slot的概念,最直接的方法是让任务直接向调度器申请自己需要的资源(比如某个任务可申请1.5GB内存和1个CPU),而调度器则按照任务实际需求为其精细地分配对应的资源量,不再简单的将一个Slot分配给它,Hadoop2.0正式采用了这种基于真实资源量的资源分配方案。Hadoop2.0(YARN)允许每个节点(NodeManager)配置可用的CPU和内存资源总量,而中央调度器则会根据这些资源总量分配给应用程序。节点(NodeManager)配置参数如下:1)yarn.nodemanager.resource.memory-mb可分配的物理内存总量,默认是8*1024,即8GB。2)yarn.nodemanager.vmem-pmem-ratio任务使用单位物理内存量对应最多可使用的虚拟内存量,默认值是2.1,表示每使用1MB的物理内存,最多可以使用2.1MB的虚拟内存总量。3)yarn.nodemanager.resource.cpu-vcore可分配的虚拟CPU个数,默认是8。为了更细粒度的划分CPU资源和考虑到CPU性能异构性,YARN允许管理员根据实际需要和CPU性能将每个物理CPU划分成若干个虚拟CPU,而每管理员可为每个节点单独配置可用的虚拟CPU个数,且用户提交应用程序时,也可指定每个任务需要的虚拟CPU个数。比如node1节点上有8个CPU,node2上有16个CPU,且node1CPU性能是node2的2倍,那么可为这两个节点配置相同数目的虚拟CPU个数,比如均为32,由于用户设置虚拟CPU个数必须是整数,每个任务至少使用node2的半个CPU(不能更少了)。此外,Hadoop2.0还引入了基于cgroups的轻量级资源隔离方案,这大大降低了同节点上任务间的相互干扰,而Hadoop1.0仅采用了基于JVM的资源隔离,粒度非常粗糙。Hadoop1.0从上图中可以清楚的看出原MapReduce程序的流程及设计思路:首先用户程序(JobClient)提交了一个job,job的信息会发送到JobTracker中,JobTracker是Map-reduce框架的中心,他需要与集群中的机器定时通信(heartbeat),需要管理哪些程序应该跑在哪些机器上,需要管理所有job失败、重启等操作。TaskTracker是Map-reduce集群中每台机器都有的一个部分,他做的事情主要是监视自己所在机器的资源情况。TaskTracker同时监视当前机器的tasks运行状况。TaskTracker需要把这些信息通过heartbeat发送给JobTracker,JobTracker会搜集这些信息以给新提交的job分配运行在哪些机器上。上图虚线箭头就是表示消息的发送-接收的过程。可以看得出原来的map-reduce架构是简单明了的,在最初推出的几年,也得到了众多的成功案例,获得业界广泛的支持和肯定,但随着分布式系统集群的规模和其工作负荷的增长,原框架的问题逐渐浮出水面,主要的问题集中如下:1.JobTracker是Map-reduce的集中处理点,存在单点故障。2.JobTracker完成了太多的任务,造成了过多的资源消耗,当map-reducejob非常多的时候,会造成很大的内存开销,潜在来说,也增加了JobTrackerfail的风险,这也是业界普遍总结出老Hadoop的Map-Reduce只能支持4000节点主机的上限。3.在TaskTracker端,以map/reducetask的数目作为资源的表示过于简单,没有考虑到CPU/内存的占用情况,如果两个大内存消耗的task被调度到了一块,很容易出现OOM。4.在TaskTracker端,把资源强制划分为maptaskslot和reducetaskslot,如果当系统中只有maptask或者只有reducetask的时候,会造成资源的浪费,也就是前面提过的集群资源利用的问题。5.源代码层面分析的时候,会发现代码非常的难读,常常因为一个class做了太多的事情,代码量达3000多行,,造成class的任务不清晰,增加bug修复和版本维护的难度。6.从操作的角度来看,现在的HadoopMapReduce框架在有任何重要的或者不重要的变化(例如bug修复,性能提升和特性化)时,都会强制进行系统级别的升级更新。更糟的是,它不管用户的喜好,强制让分布式集群系统的每一个用户端同时更新。这些更新会让用户为了验证他们之前的应用程序是不是适用新的Hadoop版本而浪费大量时间。hadoop2.0:从业界使用分布式系统的变化趋势和hadoop框架的长远发展来看,MapReduce的JobTracker/TaskTracker机制需要大规模的调整来修复它在可扩展性,内存消耗,线程模型,可靠性和性能上的缺陷。在过去的几年中,hadoop开发团队做了一些bug的修复,但是最近这些修复的成本越来越高,这表明对原框架做出改变的难度越来越大。为从根本上解决旧MapReduce框架的性能瓶颈,促进Hadoop框架的更长远发展,从0.23.0版本开始,Hadoop的MapReduce框架完全重构,发生了根本的变化。新的HadoopMapReduce框架命名为MapReduceV2或者叫Yarn。重构根本的思想是将JobTracker两个主要的功能分离成单独的组件,这两个功能是资源管理和任务调度/监控。新的资源管理器全局管理所有应用程序计算资源的分配,每一个应用的ApplicationMaster负责相应的调度和协调。一个应用程序无非是一个单独的传统的MapReduce任务或者是一个DAG(有向无环图)任务。ResourceManager和每一台机器的节点管理服务器能够管理用户在那台机器上的进程并能对计算进行组织。事实上,每一个应用的ApplicationMaster是一个详细的框架库,它结合从ResourceManager获得的资源和NodeManager协同工作来运行和监控任务。上图中ResourceManager支持分层级的应用队列,这些队列享有集群一定比例的资源。从某种意义上讲它就是一个纯粹的调度器,它在执行过程中不对应用进行监控和状态跟踪。同样,它也不能重启因应用失败或者硬件错误而运行失败的任务。ResourceManager是基于应用程序对资源的需求进行调度的;每一个应用程序需要不同类型的资源因此就需要不同的容器。资源包括:内存,CPU,磁盘,网络等等。可以看出,这同现Mapreduce固定类型的资源使用模型有显著区别,它给集群的使用带来负面的影响。资源管理器提供一个调度策略的插件,它负责将集群资源分配给多个队列和应用程序。调度插件可以基于现有的能力调度和公平调度模型。上图中NodeManager是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用情况(CPU,内存,硬盘,网络)并且向调度器汇报。每一个应用的ApplicationMaster的职责有:向调度器索要适当的资源容器,运行任务,跟踪应用程序的状态和监控它们的进程,处理任务的失败原因。
本文标题:hadoop1.x和hadoop2.x的区别
链接地址:https://www.777doc.com/doc-2875807 .html