yarn的资源隔离

最近一周几乎都在做关于yarn的资源隔离的事情,也重新看了一下以前看过的关于yarn的书,这次就当是写写自己的工作总结吧。

之所以要做资源隔离,是因为现在公司内部有很多团队都在使用yarn来提交各式各样的任务,例如hive的mapreduce,spark在yarn上的部署,sqoop导数据等等,为了防止单个任务使用过多资源,而导致整个集群的其他任务不可运行,所以就要使用yarn的资源隔离了。

虽然yarn中,有Capacity Scheduler以及Fair Scheduler这两种方式来实现资源在不同任务(准确的说应该是队列)之间的调度,但是个人感觉这两种分配策略在资源隔离上面真的没有什么太大的区别,因为两者都可以对各个队列限制使用的最大最小资源;而且也可将现有资源划分为不同的队列,每个应用只在特定的队列提交。当然对于队列内部任务之间的资源隔离,Fair Scheduler支持的方式多了一种FIFO策略,由于公司使用的hadoop默认使用Fair Scheduler,所以最后还是使用的Fair策略。下面大概讲一下自己是怎么做的吧。

step1:针对不同的开发团队,建立不同的用户,就比如下面的截图,针对两个group分别建立了group1以及group2这两个用户:

step2:修改权限

这里的权限包括hadoop权限、hdfs权限,这就要根据自己的实际情况来看了;

step3:修改yarn-site.xml

主要修改了以下几个参数

yarn.resourcemanager.scheduler.class:配置使用哪种Scheduler,由于使用的是FairScheduler,所以设置为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

yarn.scheduler.fair.allocation.file:指定分配策略文件路径

yarn.scheduler.fair.preemption:是否支持队列之间的资源抢占,虽然设置为false,但是还是多多少少会出现繁忙队列抢占了一点空闲队列资源的现象

关于yarn-site的配置参数还有很多,大家可以在网上找找;

step4:编写fair scheduler的具体配置文件,在自己测试的时候,大概如下面的截图

首先简单介绍一下,yarn中资源是按照队列(或者说是资源池)来分配的,队列有自己的子队列,而root队列就像java中的Object队列一样(如果没有设置,所有应用向root.default队列提交应用),是所有队列的父队列。在上面的配置文件中,这对group1队列定义了如下规则:

1.group1以及group2这两个root队列的子队列(这里队列命名跟用户命名一样);

2.group1队列最少保留10G内存、10个cpu内核,最多使用15G内存、15个cpu内核;

3.队列内的应用才用公平的调度策略分配资源,最多可以在group1内运行50个应用;

4.只有group1以及hadoop用户可以向group1队列提交应用;

5.只用hadoop用户可以管理group1队列(即只有hadoop可以kill这上面的应用)。

step5:重启yarn

最后通过spark-shell --master yarn --num-executors --executor-memory --queue测试,发现的确可以做到资源隔离,达到如下效果:

1.group1用户只能向group1队列提交应用,而且即使使用资源大于最大值,也只是会略微超过一点点,不会超过很多(有兴趣的朋友可以自己试试);

2.group1用户是不能向group2队列提交任务的;

3.hadoop用户还是可以向group1、group2、default三个队列提交任务,这样可以保证系统有个类似root用户的角色。

但是发现没能实现acl的功能,即无论是hadoop、group1、group2还是任何可以执行yarn命令的用户都可以通过yarn application -kill杀死任何队列上的程序。多次参考书本以及官网,但是仍然没有成功,最后不得已,只能说是控制yarn命令的权限为700,只让hadoop用户可以执行这个命令,希望以后可以找出更好地解决方案。

2017年1月7日

时间: 2024-10-11 10:46:50

yarn的资源隔离的相关文章

Hadoop YARN资源隔离技术

YARN对内存资源和CPU资源采用了不同的资源隔离方案.对于内存资源,它是一种限制性资源,它的量的大小直接决定应用程序的死活,因为应用程序到达内存限制,会发生OOM,就会被杀死.CPU资源一般用Cgroups进行资源控制,Cgroups控制资源测试可以参见这篇博文Cgroups控制cpu,内存,io示例,内存资源隔离除Cgroups之外提供了另外一个更灵活的方案,就是线程监控方案. 默认情况下YARN采用线程监控的方案控制内存使用,采用这种机制的原因有两点: 1.Java创建子进程采用了"for

jstorm的cgroup资源隔离机制

本文研究一下jstorm使用cgroup做资源隔离的情况,github有文档: https://github.com/alibaba/jstorm/wiki/%E8%B5%84%E6%BA%90%E7%A1%AC%E9%9A%94%E7%A6%BB 这个文档告诉你怎么开启cgroup,但对于不太了解cgroup和jstorm细节的同学可能更有兴趣看一下到底是怎么隔离的. 废话少说,你不是告诉我cgroup做资源隔离吗?你回答我两个问题: 1.什么是cgroup 2.jstorm怎么用cgroup

Impala源码之资源管理与资源隔离

本文由  网易云发布. 前言 Impala是一个MPP架构的查询系统,为了做到平台化服务,首先需要考虑就是如何做到资源隔离,多个产品之间尽可能小的甚至毫无影响.对于这种需求,最好的隔离方案无疑是物理机器上的隔离,A产品使用这几台机器,B产品使用那几台机器,然后前端根据产品路由到不同集群,这样可以做到理想中的资源隔离,但是这样极大的增加了部署.运维等难度,而且无法实现资源的共享,即使A产品没有任务在跑,B产品也不能使用A产品的资源,这无疑是一种浪费.毛主席教导我们浪费是可耻的,所以我们要想办法在充

Kafka Topic Partition Replica Assignment实现原理及资源隔离方案

本文共分为三个部分: Kafka Topic创建方式 Kafka Topic Partitions Assignment实现原理 Kafka资源隔离方案 1. Kafka Topic创建方式 Kafka Topic创建方式有以下两种表现形式: (1)创建Topic时直接指定Topic Partition Replica与Kafka Broker之间的存储映射关系 /usr/lib/kafka_2.10-0.8.2.1/bin/kafka-topics.sh --zookeeper ZooKeep

[转]基于overlayfs的硬盘资源隔离工具troot

原文在这里:http://blog.donghao.org/tag/overlayfs/ 某些开发测试团队会有这样的需求:多个开发或测试人员在一台物理机上搭环境.装rpm包.测试等,目录很可能互相干扰.避免干扰的最直接办法当然是装虚拟机,但是如果仅仅只是想把根目录隔离一下,而不需要隔离CPU和内存,那么虚拟机方案偏重了些.所以,我们做了一个叫troot的小工具,每个人都可以自己创建一个虚根目录,然后进入这个虚根目录工作,工作起来感觉就像一个全新的跟别人互不干扰的新根目录一样.不过这个troot的

[转]Greenplum 资源隔离的原理与源码分析

摘要: 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的硬件资源,所以并发一多的话,query相互之间的资源争抢就比较严重. Greenplum资源隔 背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的硬件资源,所

【转载】Linux cgroup资源隔离各个击破之 - cpu隔离1

Linux cgroup 有两个子系统支持CPU隔离.一个是cpu子系统,另一个是cpuset子系统. cpu子系统根据进程设置的调度属性,选择对应的CPU资源调度方法 .1. 完全公平调度 Completely Fair Scheduler (CFS)原理详见https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txtCFS用于处理以下几种进程调度策略SCHED_OTHERSCHED_BATCHSCHED_IDL

【转载】Linux cgroup资源隔离各个击破之 - io隔离

Linux Cgroup blkio子系统的用法.   blkio子系统支持的两种IO隔离策略 .1. (Completely Fair Queuing 完全公平队列)cfq io调度策略,支持按权重分配IO处理的时间片,从而达到IO在各资源组直接的调度和限制的目的,权重取值范围100-1000.通过以下两个文件进行配置. blkio.weight 默认值 blkio.weight_device 块设备级的值 (major:minor weight) (优先级高于blkio.weight) 例子

Docker背后的内核知识:命名空间资源隔离

完整的请看这里:http://linux.cn/article-5057-1.html 下面我只摘抄一部分!!! Linux内核中提供了六种命名空间(namespace)隔离的系统调用,如下. Namespace                          系统调用参数                             隔离内容     UTS CLONE_NEWUTS 主机名与域名 IPC CLONE_NEWIPC 信号量,消息队列和共享内存 PID CLONE_NEWPID 进程