设计网站都有什么作用,产品线上推广方案,网站服务器租用一年多少钱啊,公众号转wordpress在这篇博客中#xff0c;主要介绍了Yarn对MRv1的改进#xff0c;以及Yarn简单的内存配置和Yarn的资源抽象container。我么知道MRv1存在的主要问题是#xff1a;在运行时#xff0c;JobTracker既负责资源管理又负责任务调度#xff0c;这导致了它的扩展性、资源利用率低等问…在这篇博客中主要介绍了Yarn对MRv1的改进以及Yarn简单的内存配置和Yarn的资源抽象container。我么知道MRv1存在的主要问题是在运行时JobTracker既负责资源管理又负责任务调度这导致了它的扩展性、资源利用率低等问题。之所以存在这样的问题是与其最初的设计有关如下图从上图可以看到MRv1是围绕着MapReduce进行并没有过多地考虑以后出现的其它数据处理方式 。按着上图的设计思路我们每开发一种数据处理方式例如spark都要重复实现相应的集群资源管理和数据处理。因此Yarn就很自然的被开发出来了。Yarn对MRv1的最大改进就是将资源管理与任务调度分离使得各种数据处理方式能够共享资源管理如下图所示从上图我们可以看到Yarn是一种统一资源管理方式是从MRv1中的JobTracker分离出来的。这样的好处显而易见资源共享扩展性好等。MRv1与Yarn的主要区别在MRv1中由JobTracker负责资源管理和作业控制而Yarn中JobTracker被分为两部分ResourceManagerRM和ApplicationMasterAM。如下图所示从上图中我们可以清晰的看到 对于MRv1无论是资源管理里还是任务调度都是有JobTracker来完成得。这导致了JobTracker负荷太大不便于管理和扩展而对于Yarn我们看可以清晰地看到资源管理和任务调度被分为了两个部分RM和AM。Yarn与MRv1的差异对编程的影响我们知道MRv1主要由三部分组成编程模型(API)、数据处理引擎(MapTask和ReduceTask)和运行环境(JobTracker和TaskTracker);Yarn继承了MRv1的编程模型和数据处理改变的只是运行环境所以对编程没有什么影响。为了更好 的说明Yarn的资源管理首先来看下Yarn的框架如下图所示从上图可以看到 当客户向RM提交 作业时由AM负责向RM提出资源申请和向NameManagerNM提出task执行 。也就是说 在这个过程中RM负责资源调度AM 负责任务调度。几点重要说明RM负责整个集群的资源管理与调度Nodemanager(NM)负责单个节点的资源管理与调度NM定时的通过心跳的形式与RM进行通信报告节点的健康状态与内存使用情况AM通过与RM交互获取资源然后然后通过与NM交互启动计算任务。下面对上面的内容通过内存资源配置进行详细说明下面对上面的内容通过内存资源配置进行详细说明RM的内存资源配置主要是通过下面的两个参数进行的这两个值是Yarn平台特性应在yarn-sit.xml中配置好 yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocation-mb说明单个容器可申请的最小与最大内存应用在运行申请内存时不能超过最大值小于最小值则分配最小值从这个角度看最小值有点想操作系统中的页。最小值还有另外一种用途计算一个节点的最大container数目注这两个值一经设定不能动态改变(此处所说的动态改变是指应用运行时)。NM的内存资源配置主要是通过下面两个参数进行的这两个值是Yarn平台特性应在yarn-sit.xml中配置 yarn.nodemanager.resource.memory-mbyarn.nodemanager.vmem-pmem-ratio说明每个节点可用的最大内存RM中的两个值不应该超过此值。此数值可以用于计算container最大数目即用此值除以RM中的最小容器内存。虚拟内存率是占task所用内存的百分比默认值为2.1倍;注意第一个参数是不可修改的一旦设置整个运行过程中不可动态修改且该值的默认大小是8G即使计算机内存不足8G也会按着8G内存来使用。AM内存配置相关参数此处以MapReduce为例进行说明这两个值是AM特性应在mapred-site.xml中配置如下mapreduce.map.memory.mbmapreduce.reduce.memory.mb说明这两个参数指定用于MapReduce的两个任务Map and Reduce task的内存大小其值应该在RM中的最大最小container之间。如果没有配置则通过如下简单公式获得max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))一般的reduce应该是map的2倍。注这两个值可以在应用启动时通过参数改变AM中其它与内存相关的参数还有JVM相关的参数这些参数可以通过如下选项配置mapreduce.map.java.optsmapreduce.reduce.java.opts说明这两个参主要是为需要运行JVM程序java、scala等准备的通过这两个设置可以向JVM中传递参数的与内存有关的是-Xmx-Xms等选项。此数值大小应该在AM中的map.mb和reduce.mb之间。我们对上面的内容进行下总结当配置Yarn内存的时候主要是配置如下三个方面每个Map和Reduce可用物理内存限制对于每个任务的JVM对大小的限制虚拟内存的限制下面通过一个具体错误实例进行内存相关说明错误如下Container[pid41884,containerIDcontainer_1405950053048_0016_01_000284] is running beyond virtual memory limits. Current usage: 314.6 MB of 2.9 GB physical memory used; 8.7 GB of 6.2 GB virtual memory used. Killing container.配置如下点击(此处)折叠或打开 property nameyarn.nodemanager.resource.memory-mb/name value100000/value /property property nameyarn.scheduler.maximum-allocation-mb/name value10000/value /property property nameyarn.scheduler.minimum-allocation-mb/name value3000/value /property property namemapreduce.reduce.memory.mb/name value2000/value /property 通过配置我们看到容器的最小内存和最大内存分别为3000m和10000m而reduce设置的默认值小于2000mmap没有设置所以两个值均为3000m也就是log中的“2.9 GB physical memory used”。而由于使用了默认虚拟内存率(也就是2.1倍)所以对于Map Task和Reduce Task总的虚拟内存为都为3000*2.16.2G。而应用的虚拟内存超过了这个数值故报错 。解决办 法在启动Yarn是调节虚拟内存率或者应用运行时调节内存大小。 在上Yarn的框架管理中无论是AM从RM申请资源还是NM管理自己所在节点的资源都是通过container进行的。Container是Yarn的资源抽象此处的资源包括内存和cup等。下面对 container进行比较详细的介绍。为了是大家对container有个比较形象的认识首先看下图 从上图中我们可以看到首先AM通过请求包ResourceRequest从RM申请资源当获取到资源后AM对其进行封装封装成ContainerLaunchContext对象通过这个对象AM与NM进行通讯 以便启动该任务。下面通过ResourceRequest、container和ContainerLaunchContext的protocol buffs定义对其进行具体分析。 ResourceRequest结构如下 点击(此处)折叠或打开 message ResourceRequestProto { optional PriorityProto priority 1; // 资源优先级 optional string resource_name 2; // 期望资源所在的host optional ResourceProto capability 3; // 资源量mem、cpu optional int32 num_containers 4; // 满足条件container个数 optional bool relax_locality 5 ; //default true; } 对上面结构进行简要按序号说明 2在提交申请时期望从哪台主机上获得但最终还是AM与RM协商决定 3只包含两种资源即内存和cpu申请方式 注1、由于2与4并没有限制资源申请量则AP在资源申请上是无限的。2、Yarn采用覆盖式资源申请方式即AM每次发出的资源请求会覆盖掉之前在同一节点且优先级相同的资源请求, 也就是说同一节点中相同优先级的资源请求只能有一个。 container结构 点击(此处)折叠或打开 message ContainerProto { optional ContainerIdProto id 1; //container id optional NodeIdProto nodeId 2; //container资源所在节点 optional string node_http_address 3; optional ResourceProto resource 4; //分配的container数量 optional PriorityProto priority 5; //container的优先级 optional hadoop.common.TokenProto container_token 6; //container token用于安全认证 } 注每个container一般可以运行一个任务当AM收到多个container时将进一步分给某个人物。如MapReduce ContainerLaunchContext结构 点击(此处)折叠或打开 message ContainerLaunchContextProto { repeated StringLocalResourceMapProto localResources 1; //该Container运行的程序所需的在资源例如jar包 optional bytes tokens 2;//Security模式下的SecurityTokens repeated StringBytesMapProto service_data 3; repeated StringStringMapProto environment 4; //Container启动所需的环境变量 repeated string command 5; //该Container所运行程序的命令,比如运行的为java程序,即$JAVA_HOME/bin/java org.ourclassrepeated ApplicationACLMapProto application_ACLs 6;//该Container所属的Application的访问 控制列表 } 下面结合一段代码仅以ContainerLaunchContext为例进行描述(本应该写个简单的有限状态机的便于大家理解但时间不怎么充分) 点击(此处)折叠或打开 申请一个新的ContainerLaunchContext ContainerLaunchContext ctx Records.newRecord(ContainerLaunchContext.class); 填写必要的信息 ctx.setEnvironment(...); childRsrc.setResource(...); ctx.setLocalResources(...); ctx.setCommands(...); 启动任务 startReq.setContainerLaunchContext(ctx); 最后对container进行如下总结container是Yarn的资源抽象封装了节点上的一些资源主要是CPU与内存container是AM向NM申请的其运行是由AM向资源所在NM发起的并最终运行 的。有两类container一类是AM运行需要的container另一类是AP为执行任务向RM申请的。