Hadoop1.0架构回顾
Hadoop是Apache的一个开源分布式计算平台,以分布式文件系统HDFS,和MapReduce为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。HDFS的高容错性、高伸缩性等优点形成分布式系统;MapReduce分布式编程模型让我们开发并行应用程序。
Hadoop为包含多个子项目的集合,其核心内容是MapReduce和HDFS。主要是通过HDFS来实现对分布式存储的底层支持,并且它会通过MapReduce来实现对分布式并行任务处理。
MapReduce是一种编程模型,用于大规模数据集的并行运算。它的主要思想是从函数式编程中借来的,它使得我们在不了解分布式并行 编程的情况下也能方便地将程序运行在分布式系统上。MapReduce在执行时先指定一个Map函数,把输入键值对映射成一组新的键值对,经过一定的处理后交给Reduce,它对相同的Key下的所有Value进行处理后再输出键值对作为最终的结果。
HDFS,是一个分布式文件系统,具有高容错性特点,故障的检测和自动快速恢复是HDFS的一个核心目标;它使应用程序流式的数据访问数据集;大部分的HDSF程序操作文件时需要一次写入,多次读取,一个文件一旦经过创建、写入、关闭后就不需要修改了,从面简化了数据一致性问题和高吞吐量的数据访问问题。
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作(注意存在单点问题);集群中的DataNode管理存储的数据。HDFS文件被分成若干个数据块,这些数据块存放在一组DataNode上,NameNode执行文件系统的命名空间操作,如打开、关闭、重命名文件或目录等,也负责数据块到具体DataNode的映射,统一调度进行数据块的创建、删除和复制工作等(即单点,工作压力还很大哈)。一个典型的部署是集群中的一台机器运行一个NameNode实现,其他机器分别运行一个DataNode实例。
MapReduce以一种高容错的方式并行处理大量的数据集,实现Hadoop的并行任务处理功能。由一个单独运行在主节点上的JobTracker和运行在每个集群从节点上的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前失败的任务;从节点仅负责接收主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和配置信息后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
总结
- 数据分布存储:HDFS由一个NameNode和N个DataNode组成,但HDFS底层把文件切成Block,然后这些Block分散在存储于不同的DataNode上,每个Block还可以复制数份数据存储于不同的DataNode上,达到容灾的目的。NameNode是整个HDFS的核心,它通过维护一些数据结构来记录每一个文件被切割了多少个Block、这些Block可以从哪些DataNode中获取,及各个DataNode的状态等重要信息。
- 分布式并行计算:Hadoop中有一个作为主控的JobTracker,用于调度和管理TaskTracker,JobTracker可以运行于集群中的任意一台计算机上,TaskTracker则负责执行任务,它运行于DataNode上,DataNode既是数据存储节点,也是计算节点。JobTracker将map任务和reduce任务分发给空闲的TaskTracker,并负责监控任务的运行情况。如某一TaskTracker出了故障,JobTracker会将其负责的任务转交给另一个空闲的TaskTracker重新运行。
- 本地计算:数据存储在哪一个计算机上,就在那台计算机上进行这部分数据的计算,这样可以减少数据在网络上的传输。移动计算比移动数据更经济。
- 任务粒度:把原始大数据集切割成小数据时,通常让小数据集小于或等于HDFS中一个Block的大小,这样能够保证一个小数据集是位于一台计算机上,便于本地计算。有M个小数据集待处理,就启动M个map任务,这里的M个map任务分布于N台计算机上,reduce任务的数量R则可由用户指定。
- 数据分割(Partition):把map任务输出的中间结果按key的范围划分成R份,划分时通常使用hash函数,这样可以保证某一范围内的Key一定是由一个reduce任务来处理,可以简化Reduce的过程。
- 数据合并(Combine):在数据分割前,还可以先对中间结果进行数据合并,将中间结果中有相同key的键值对合并成一对。Combine的过程与Reduce的过程类似,很多情况下直接使用Reduce函数,Combine作为Map任务的一部分,在执行完Map函数后立刻执行。Combine能够减少中间结果的键值对的数据,从而降低网络流量。
- Reduce:Map任务的中间结果在完成Combine和Partition后,以文件形式存在本地磁盘上。中间结果文件的位置会通知主控JobTracker,JobTracker再通知Reduce任务到哪一个DataNode上取中间结果。所有的map任务生产的中间结果均按Key用同一个Hash函数划分成R份,R个Reduce任务各自负责一段key区间。每个Reduce需要向许多个Map任务节点取得落在其负责的key区间内的中间结果,然后执行reduce函数,开成一个最终的结果文件。
- 任务管道:有R个reduce任务,就会有R个最终结果,很多情况下R个最终结果并不需要合并成一个最终结果,因为这R个结果又可以作为另一个计算任务的输入,开始另一个并行计算任务,这也就形成了任务管道。
存在的问题
- HDFS存在的问题
- NameNode单点故障,难以应用于在线场景
- NameNode压力过大,且内存受限,影响系统扩展性。
- MapReduce存在的问题
- JobTracker单点故障
- JobTracker访问压力大,影响系统扩展性
- 难以支持除MapReduce之外的框架,如Spark、Storm等
Yarn资源管理
Apache Hadoop Yarn(Yet Another Resource Negotiator,另一种资源协调者)是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
基本思想
Yarn的基本思想是将JobTracker的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。这里的应用程序是指传统的MapReduce作业或作业的DAG(有向无环图)。
ResourceManager
Yarn分层结构的本质是ResourceManager。这个实体控制整个集群并管理应用程序基础计算资源的分配。ResourceManager将各个资源部分(计算、内存、带宽等)精心安排给基础 NodeManager(Yarn 的每节点代理)。ResourceManager还与ApplicationMaster一起分配资源,与 NodeManager一起启动和监视它们的基础应用程序。在此上下文中,ApplicationMaster承担了以前的TaskTracker的一些角色,ResourceManager承担了JobTracker的角色。
ApplicationMaster
ApplicationMaster管理一个在Yarn内运行的应用程序的每个实例。ApplicationMaster负责协调来自ResourceManager的资源,并通过 NodeManager监视容器的执行和资源使用(CPU、内存等的资源分配)。从 Yarn角度讲,ApplicationMaster是用户代码,因此存在潜在的安全问题。Yarn假设ApplicationMaster存在错误或者甚至是恶意的,因此将它们当作无特权的代码对待。
NodeManager
NodeManager管理一个Yarn集群中的每个节点。NodeManager提供针对集群中每个节点的服务,从监督对一个容器的终生管理到监视资源和跟踪节点健康。MRv1通过插槽管理Map和Reduce任务的执行,而NodeManager 管理抽象容器,这些容器代表着可供一个特定应用程序使用的针对每个节点的资源。Yarn继续使用HDFS层。它的主要NameNode用于元数据服务,而 DataNode用于分散在一个集群中的复制存储服务。
工作流程
要使用一个Yarn集群,首先需要来自包含一个应用程序的客户的请求。ResourceManager协商一个容器的必要资源,启动一个 ApplicationMaster来表示已提交的应用程序。通过使用一个资源请求协议,ApplicationMaster协商每个节点上供应用程序使用的资源容器。执行应用程序时,ApplicationMaster监视容器直到完成。当应用程序完成时,ApplicationMaster从ResourceManager注销其容器,执行周期就完成了。
MRv1与MRv2从架构上的区别
多种计算框架可以运行在一个集群中
- 良好的扩展性、高可用
- 对多种类型应用进行统一管理和调度
- 自带了多种用户调度器,适合共享集群环境
- 提高了资源利用率、降低运维成本和数据共享成本
总结
RM
RM处理客户端请求,接收JobSubmitter提交的作业,按照作业的上下文 (Context) 信息,以及从 NodeManager(NM)收集来的状态信息,启动调度过程,分配一个Container作为Application Master
RM拥有为系统中所有应用资源分配的决定权,是中心服务,做的事情就是调度、启动每一个Job所属的Application、另外监控Application的存在情况
与运行在每个节点上的NM进程交互,通过心跳通信,达到监控NM的目的
NM
是slave进程,类似TaskTracker的角色,是每个机器框架代理
处理来自RM的任务请求
接收并处理来自ApplicationMaster的Container启动、停止等各种请求
负责启动应用程序的Container(执行应用程序的容器),并监控他们的资源使 用情况(CPU、内存、磁盘和网络),并报告给RM
总的来说,在单节点上进行资源管理和任务管理
AM
应用程序的Master,每一个应用对应一个AM,在用户提交一个应用程序时,一 个AM的轻量型进程实例会启动,AM协调应用程序内的所有任务的执行
负责一个Job生命周期内的所有工作,类似旧的JobTracker
每一个Job都有一个AM,运行在RM以外的机器上下文
与NM协同工作与Scheduler协商合适的Container进行Container的监控
是一个普通Container的身份运行
Container
是任务运行环境的抽象封装
Container只是使用NM上指定资源的权利
AM必须向NM提供更多的信息来启动Container
描述任务的运行资源(节点、内存、cpu)、启动命令和运行环境
Yarn框架对于旧的MapReduce框架的优势
减小了JobTracker(也就是现在的 RM)的资源消耗,并且让监测每一个Job子任务(tasks)状态的程序分布式化了,更安全、更优美
AM是一个可变更的部分,用户可以对不同的编程模型写自己的AM,让更多类 型的编程模型能够跑在 Hadoop集群中
对于资源的表示以内存为单位,比之前以剩余 slot 数目更合理
老的框架中,JobTracker一个很大的负担就是监控job下的tasks的运行状况 现在,这个部分就扔给ApplicationMaster做了
资源表示成内存量,那就没有了之前的 map slot/reduce slot 分开造成集群资 源闲置的尴尬情况
Yarn框架的运行过程
Client请求Resource Manager运行一个 Application Master实例(step 1);
Resource Manager选择一个Node Manager,启 动一个Container并运行Application Master实例( step 2a、step 2b);
Application Master根据实际需要向Resource Manager请求更多的Container资源(step 3);
Application Master通过获取到的Container资源执 行分布式计算(step 4a、step 4b)
Yarn的容错能力
RM挂掉:单点故障,新版本可以基于Zookeeper实现HA高可用集群,可通过 配置进行设置准备RM,主提供服务,备同步主的信息,一旦主挂掉,备立即做 切换接替进行服务
NM挂掉:不止一个,当一个挂了,会通过心跳方式通知RM,RM将情况通知对应AM,AM作进一步处理
AM挂掉:若挂掉,RM负责重启,其实RM上有一个RMApplicationMaster,是AM的AM,上面保存已经完成的task,若重启AM,无需重新运行已经完成的task