yarn 的多租户配置实现资源隔离
资源隔离目前有 2 种,静态隔离和动态隔离。
静态隔离:
所谓静态隔离是以服务隔离,是通过 cgroups(LINUX control groups) 功能来支持的。比如 HADOOP 服务包含 HDFS, HBASE, YARN 等等,那么我们固定的设置比例,HDFS:20%, HBASE:40%, YARN:40%, 系统会帮我们根据整个集群的 CPU,内存,IO 数量来分割资源,先提一下,IO 是无法分割的,所以只能说当遇到 IO 问题时根据比例由谁先拿到资源,CPU 和内存是预先分配好的。
上面这种按照比例固定分割就是静态分割了,仔细想想,这种做法弊端太多,假设我按照一定的比例预先分割好了,但是如果我晚上主要跑 mapreduce, 白天主要是 HBASE 工作,这种情况怎么办? 静态分割无法很好的支持,缺陷太大,这种模型可能不太合适。
动态隔离:
动态隔离只要是针对 YARN 以及 impala, 所谓动态只是相对静态来说,其实也不是动态。 先说 YARN, 在 HADOOP 整个环境,主要服务有哪些? mapreduce(这里再提一下,mapreduce 是应用,YARN 是框架,搞清楚这个概念),HBASE, HIVE,SPARK,HDFS,IMPALA, 实际上主要的大概这些,很多人估计会表示不赞同,oozie, ES, storm , kylin,flink 等等这些和 YARN 离的太远了,不依赖 YARN 的资源服务,而且这些服务都是单独部署就 OK,关联性不大。 所以主要和 YARN 有关也就是 HIVE, SPARK,Mapreduce。这几个服务也正式目前用的最多的(HBASE 用的也很多,但是和 YARN 没啥关系)。
根据上面的描述,大家应该能理解为什么所谓的动态隔离主要是针对 YARN。好了,既然 YARN 占的比重这么多,那么如果能很好的对 YARN 进行资源隔离,那也是不错的。如果我有 3 个部分都需要使用 HADOOP,那么我希望能根据不同部门设置资源的优先级别,实际上也是根据比例来设置,建立 3 个 queue name, 开发部们 30%,数据分析部分 50%,运营部门 20%。
设置了比例之后,再提交 JOB 的时候设置 mapreduce.queue.name,那么 JOB 就会进入指定的队列里面。 非常可惜的是,如果你指定了一个不存在的队列,JOB 仍然可以执行,这个是目前无解的,默认提交 JOB 到 YARN 的时候,规则是 root.users.username , 队列不存在,会自动以这种格式生成队列名称。 队列设置好之后,再通过 ACL 来控制谁能提交或者 KIll job
从上面 2 种资源隔离来看,没有哪一种做的很好,如果非要选一种,建议选取后者,隔离 YARN 资源, 第一种固定分割服务的方式实在支持不了现在的业务
评论