ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Hive多租户资源隔离实战:从YARN容量调度到Cgroups硬限制

Hive多租户资源隔离实战:从YARN容量调度到Cgroups硬限制 干过大数据平台运维的人对下面这个场景绝对不陌生公司二三十个业务线共用一套Hive集群白天业务高峰期某个数据团队一个三小时的大JOIN扫全表直接把队列资源打满另一边财务日报SQL卡在原地等资源业务方电话一个接一个打过来。这种事多来几次推大数据平台的人就成了众矢之的。这个问题的本质就是多租户共享场景下Hive执行资源隔离没有做透。这篇东西把我在真实集群上落地多租户资源隔离的经验完整讲清楚从问题复盘、方案选型、配置步骤到踩坑记录全都在里面适合正在做Hive平台治理、或者计划搭建多租户大数据平台的朋友直接参考。1. 别等事故再上岗多人共享Hive集群的混乱日常1.1 一次典型的资源吸血鬼事故复盘我先还原一次印象很深的线上事故。某个上午10点正值报表集中产出时段我盯Grafana发现YARN集群的CPU使用率从40%瞬间冲到95%内存使用率逼近90%。HDFS的DataNode磁盘IO也异常增高页面访问开始变慢。去YARN资源管理页面一看某个业务线的一个Hive SQL任务占了300多个Container全部是大内存实例队列里其他应用全部处于ACCEPTED状态一个都跑不起来。后来查这个SQL其实犯了个特别低级的错误——两个维表做关联的时候关联键里包含了大量NULL值数据倾斜加上笛卡尔积式的膨胀把整个集群的临时空间和内存吃穿了。这种查询在单租户场景也就是慢一点但放在多租户共享集群里等于一颗定时炸弹。它不单拖垮自己还把别人的容灾保障全带走。我当时处理方式是Kill掉这个任务然后紧急给这个业务线单独划了个队列。但等事情平息下来我意识到一个问题靠人盯、靠Kill来治理永远是事后补救。多租户平台的资源隔离本质上应该是事前兜底而不是事后救火。1.2 能跑和稳定之间缺的正是隔离可能有人会说多租户不就是给不同部门建不同账号吗数据权限分开就行了。这个想法我一开始也有后来吃了亏才明白数据权限管的是谁能看资源隔离管的是谁能用多少。两个维度完全不是一回事。举一个很生活化的例子。一个合租房里住着四个人总电闸只有一个网线只有一根。你按房间分了钥匙数据权限但没规定谁的微波炉、谁的空调能开多久。结果某个室友每天开着电磁炉做饭功率一大直接跳闸剩下三个人都在黑灯瞎火里摸。多租户大数据平台上的资源隔离就是给每个房间装独立的电表和限制器——你可以用但别把别人搞跳闸。对Hive来说这一步尤其关键。因为Hive SQL是解释型任务你根本没法预先知道用户提交的SQL会产生多大量级。一个group by、一个join条件写歪了数据量能膨胀成几个数量级。没有隔离机制的话灾难是共享的。1.3 隔离到底要隔什么很多人在做资源隔离时只盯着CPU和内存两个指标这其实不够。根据我实际运营的经验多租户Hive平台上至少要隔四类资源缺一个都会出问题。CPU决定任务的计算速度。没有隔离时一个跑满CPU的复杂计算会拖慢所有任务。内存Hive任务有Map/Reduce/Container内存限制。内存超标轻则任务被YARN Kill重则影响NodeManager上其他Container。磁盘IOshuffle阶段、Hive中间结果落盘时磁盘IO是隐形杀手。某个任务疯狂读写磁盘Phantom OS的DataNode响应时间会大幅恶化别的任务也跟着变慢。连接与并发HiveServer2接受JDBC连接的数量、编译SQL的线程数这些服务端资源同样需要按租户做配额。否则某个业务线的一百个并发查询就能把HiveServer2的编译线程池占满其他业务的SQL连排队的机会都没有。另外还有一点经常被忽略——任务数量本身也是资源。YARN里有一个Fair Scheduler和Capacity Scheduler容量调度器的配置如果不对租户的任务数量做上限一个用户提交几千个Application光是ResourceManager处理这些申请请求就能瘫痪。所以先别急着问用哪个工具做Hive资源隔离要先想清楚你要隔离的是计算资源还是服务进程资源还是系统级资源。我底下展开的这几层方案每一层解决的东西都不太一样。2. 资源隔离前先摸清家底Hive任务到底在哪耗资源2.1 Hive任务从SQL到资源占用的完整链路做隔离得先知道任务在整个链路里消耗的资源分布在哪些环节。Hive不是单独一个计算引擎它更像是一个翻译官调度中心的角色。一个Hive SQL从提交到跑完大致走这几步SQL - HiveServer2 (解析、校验、逻辑计划、优化、物理计划) - 生成执行引擎任务 (MapReduce / Tez / Spark) - 提交到 YARN ResourceManager - RM 在 NodeManager 上启动 Container - 任务在 Container 里执行读写 HDFS / Hive Warehouse这条链路里每一环的资源消耗逻辑完全不同。HiveServer2阶段需要的是CPU和内存来跑SQL编译、元数据获取、权限校验而真正的大头——数据计算和shuffle——发生在YARN的Container里最后读写HDFS时消耗的是磁盘IO和网络带宽。有一个常见的认知误区是给Hive做了YARN队列隔离就万事大吉了。实际上YARN队列管的是第三步提交任务之后的Container资源但HiveServer2本身是一个独立的JVM服务进程它跑在集群的某几台机器上不属于任何一个YARN队列。这就意味着如果HiveServer2进程本身被压垮了你YARN队列隔离做得再好也没用。2.2 MapReduce、Tez、Spark三类计算引擎的消耗差异Hive支持多种执行引擎资源隔离方案在执行层上的原理是一样的但细化参数时还是要区分引擎。MapReduce引擎每个Stage就是一个或多个JobStage之间通过HDFS落盘传递数据。它的资源消耗点主要是Map阶段和Reduce阶段的Container内存shuffle阶段会产生大量磁盘IO。MapReduce的每个Job都是独立的Application这类引擎任务在YARN上申请Container的频率高队列压力大。Tez引擎把多个Stage合并成一个DAG减少了中间落盘资源消耗更倾向于长时间运行的Container模式。Tez会在YARN上启动一个AMApplication Master然后AM再去申请后续的Container。做资源隔离时要注意Tez的Session复用机制如果多个租户共享同一Tez Session隔离度就会下降。Spark引擎Hive on Spark会把任务转成Spark RDD/DAG执行Spark是内存迭代式计算内存资源消耗远高于MR和Tez磁盘IO相对少但Container的规格要求更高内存不够时极易OOM。做多租户隔离的设计中引擎选择会影响隔离的度量粒度。比如你用MapReduce可以精确控制每个Hive任务开多少Map、多少Reduce用Tez更多是控制整个DAG的资源上限用Spark则还要注意executor的数量和内存分配否则执行器一多队列里其他任务很容易被挤占。2.3 HiveServer2本身也是资源消耗大户HiveServer2是很多人做资源隔离时忽略的盲区。它虽然是网关角色但绝不是轻量级服务。每次SQL提交HiveServer2要完成词法解析、语法校验、语义分析、分区裁剪、优化器逻辑计划、物理计划生成和Jar包资源解析这些都是CPU密集型工作。数据量大的表光获取元数据缓存和统计信息就要消耗不少时间。更麻烦的是HiveServer2还是多线程并发模型默认会开几十个线程来处理客户端连接每个连接上又有自己的Context。如果某个租户一次性提交几百个查询HiveServer2的线程池被瞬间打满其他租户的查询请求会全部阻塞在连接池等待上。我们当时就遇到过这种场景某个业务方用sqoop批量导数据、同时跑一堆临时分析SQL直接把HS2的线程池耗尽了所有人都连接不上报的错还是千奇百怪一会Timeout一会Connection refused。所以我的经验是多租户资源隔离一定要前后两手抓后端隔离任务运行时资源前端隔离服务进程资源。后端靠YARN队列前端靠HiveServer2拆分和Cgroups限制两条腿走路才能走稳。3. 隔离方案横评YARN队列、独立HS2还是Cgroups3.1 第一层YARN容量调度器——最标准、最优先做YARN下面有两种主流调度器Capacity Scheduler容量调度器和 Fair Scheduler公平调度器。从多租户平台的角度来说我更推荐Capacity Scheduler。容量调度器的核心思想是把整个集群资源划分成多个队列每个队列拥有一个最低保障容量capacity和一个最高上限容量maximum capacity。队列之间相互借资源但再来资源的时候会优先还给超出容量的队列通过借调机制。Fair Scheduler强调所有用户/队列绝对公平在多租户场景下反而不容易管控——它默认会均分资源一旦队列变多资源碎片化很严重。用容量调度器做Hive资源隔离的时候通常的设计是把集群资源按部门或业务域划分成几个根队列下的子队列。比如root ├── root.bi (容量 40%最高 60%) ├── root.realtime (容量 20%最高 30%) ├── root.etl (容量 30%最高 50%) └── root.default (容量 10%最高 20%)关键参数有两个capacity是基础保障maximum-capacity是硬性上限。如果只配了capacity忘了配maximum-capacity在集群繁忙时一个队列最多只能拿到它自身定义的基础份额但在集群空闲时会膨胀借走别人的容量高峰期别人拿不回来等于软隔离。要做硬隔离就必须把每个队列的maximum-capacity控制好。3.2 第二层独立HiveServer2实例——从任务隔离走向服务隔离YARN隔离做完了服务层HiveServer2还是共享的。最直接的解法就是拆。每个大租户或者隔离要求高的小租户启动一个独立的HiveServer2实例通过ZooKeeper动态服务发现机制做连接路由。不同租户连接不同的HS2服务服务进程级别的线程池、连接数、元数据缓存完全独立互不干扰。我当时实际落地的时候采用了这样的拓扑两个大业务线分别建自己的HiveServer2公共用户组走一个基础的HS2集群多个HS2放在ZooKeeper后做负载均衡。每个HS2节点上的JVM堆内存配不同CPU依赖Cgroups控制这样即便某一个HS2进程因为SQL退化导致CPU飙高也不会影响到其他HS2进程。不过HS2拆分有个代价维护成本。每多一个HS2实例意味着要多监控一组JVM指标、多一份配置管理、多一个升级维护的对象。如果租户数量特别多几十个全拆是不现实的。我的建议是按资源大户去拆——给吃资源最多的几个租户单独拆HS2其余中小租户共享一个池子。3.3 第三层Cgroups硬隔离——把毛刺也压掉YARN队列隔离管的是Container的调度资源HS2拆分管的是进程独立但有一个东西它们都管不到机器底层的CPU和内存毛刺。举个例子同一个节点上跑了多个NodeManager的Container和一个HiveServer2进程CPU时间片怎么分配默认内核是竞争式的谁线程多、谁优先级高谁就抢得多。如果不加限制HiveServer2的JVM在Full GC时会瞬间占用该Node上好几个核NodeManager上的计算Container反而被挤到一边。CgroupsControl Groups可以做到进程颗粒度的CPU配额、内存上限、磁盘IO权重限制。在systemd管理的服务上可以通过配置非常方便地把HiveServer2进程挂到Cgroups里限制它最多用多少核、最多占多少内存。很多读者可能怕Cgroups操作门槛高其实systemd已经封装得很友好了。后面第5章我会把完整的配置和验证命令列出来。3.4 四类方案对比与选型决策路径我接触到的团队里最容易犯的错误是一上来就上Cgroups结果没人看得懂监控。正确的路径应该是从简到繁隔离层级方案隔离粒度成本适合场景任务调度层YARN容量调度器队列队列级低所有集群的必备基础服务接入层多HiveServer2实例进程级中资源大户、租户数量少的平台系统资源层Cgroups限制进程级CPU/内存中高对稳定性要求极高的场景会话层HS2连接数/线程池限制用户级低防某些用户刷查询我的建议路径先配YARN容量调度器必须做再按需拆分HS2不超过五个实例最后给关键节点上Cgroups兜底。一条条往后做不要一上来就All in高级方案。4. 容量调度器从配置到踩坑一套完整落地过程4.1 capacity-scheduler.xml 关键配置逐项拆解YARN的Capacity Scheduler配置文件在$HADOOP_CONF_DIR/capacity-scheduler.xml里。下面拿我实际生产环境里的一份简化配置做说明configuration !-- 定义根队列下直接有四个子队列 -- property nameyarn.scheduler.capacity.root.queues/name valuebi,realtime,etl,default/value /property !-- 每个子队列的保障容量四个加起来要等于100 -- property nameyarn.scheduler.capacity.root.bi.capacity/name value40/value /property !-- 最高上限防止空闲时借的资源不还 -- property nameyarn.scheduler.capacity.root.bi.maximum-capacity/name value60/value /property !-- 单个用户能占队列的比例默认是1100%多租户建议调小 -- property nameyarn.scheduler.capacity.root.bi.user-limit-factor/name value2/value /property !-- 队列最大同时运行的Application数量 -- property nameyarn.scheduler.capacity.root.bi.maximum-applications/name value100/value /property !-- 谁有权限往这个队列提交任务 -- property nameyarn.scheduler.capacity.root.bi.acl_submit_applications/name valuebi_team,hive/value /property /configuration几点说明capacity加总为100但如果下面还有多层队列则每层加总等于100。user-limit-factor默认值其实是1表示一个用户最多占用整个队列的全部资源如果某个队列里会出现一两个抓着资源不放的大户我一般设成2~4允许单个用户超出单队列的1/N均值但不超过整体上限。maximum-applications非常重要。不设这个一个用户狂提交几千个Spark任务控制队列的资源上限也没用光是ApplicationMaster就会耗掉大量内存。当然capacity-scheduler.xml改完之后不是重启YARN才能生效的可以直接执行yarn rmadmin -refreshQueues它会热加载队列配置不需要重启ResourceManager这一点对生产环境来说非常友好。4.2 把Hive用户映射到多租户队列配置好YARN队列后下一步是把Hive任务塞进对应的队列。这一步很多新手容易卡住因为Hive提交任务时用的是引擎相关的队列参数不同的引擎队列名不一样得在HiveServer2会话里设置。MapReduce引擎SET mapreduce.job.queuenameroot.bi;Tez引擎SET tez.queue.nameroot.bi;Spark引擎SET spark.yarn.queueroot.bi;如果希望做到用户自动进对应队列而不是靠每个用户手动设置可以在HiveServer2所在节点的hive-site.xml中设置默认配置项或者通过Hive的Hook的方式动态改写Session配置。比较优雅的一种做法是在hive-site.xml里配置hive.server2.session.init.scripts让每个租户连接时执行初始化SQLproperty namehive.server2.session.init.scripts/name value/opt/hive/conf/hive-init-bi.sql/value /property然后hive-init-bi.sql里面根据当前用户再设置队列。这里有个细节这个初始化脚本是拿$HADOOP_USER_NAME客户端传入的用户名来识别租户的而不是JDBC里的用户名。如果你是通过JDBC连接、用Kerberos做认证那用户名就是认证主体需要在写脚本时映射。我们当时是统一维护了一个用户到队列的映射脚本每来一个租户只要改一下映射文件就行。4.3 踩坑实录一ACL配置导致所有用户被拒第一次配置容量调度器上线时我犯过一个低级但影响巨大的错误。我在acl_submit_applications里写了内网的用户名白名单但漏掉了调度器内部服务本身提交的任务。结果刷新队列配置后Hive的作业一提交到YARN就报No queue permissions连我自己用hive用户提交的测试任务都进不去。排查过程是这样的先看ResourceManager日志里面有明显的User xx cannot submit applications to queue root.xxx。然后我用命令行试提交yarn application -queue root.bi -appId xxx发现直接被拒。此时怀疑是配置中的ACL把某些系统用户、包括ResourceManager自身的服务用户漏掉了。解决办法是每个队列的acl_submit_applications不仅要包含业务用户组还要把HiveServer2启动用户通常是hive、Yarn客户端用户yarn一起加进去否则上层服务提交任务时全都会踢到钢板上。这个坑给我们的教训是ACL权限不是越严格越好服务账号的逃逸口必须预留。建议线上配置时ACL写成服务账号业务用户组的并集。4.4 踩坑实录二maximum-capacity没配置硬隔离变软隔离第二个坑是从监控数据里看出来的。我上线了YARN队列后一度觉得这下没问题了。结果某天bi队列突然跑到集群总资源的85%——我明明只给它配了40%的capacity。后来去看配置表才发现maximum-capacity那一项我漏配了默认值就是100%。这意味着bi队列在集群空闲时可以把其他队列的空闲资源全部借走而且等到其他队列的任务真正提交时YARN的抢占机制preemption又没有开启空闲资源也不回来。这等于雨露均沾的理想状态被打破其他租户完全得不到保障。开启抢占功能也不是万能的因为在yarn-site.xml里开启yarn.resourcemanager.scheduler.monitor.enable和yarn.resourcemanager.scheduler.monitor.policies是需要谨慎评估的它会导致YARN强制Kill那些超出配额的容器有些长任务会因此莫名其妙被中断。所以我的建议是别依赖抢占把maximum-capacity老老实实配好给每个队列都钉死上限。每次上线新队列必须自查三件事capacity加总是否为100maximum-capacity是否小于100ACL是否包含了服务账号。这三项没问题容量隔离这层基本就稳了。5. 戴上Cgroups紧箍咒对HiveServer2做CPU和内存硬限制5.1 为什么一定要动HiveServer2这个进程前文提过YARN管不到HiveServer2自身。可HS2又是一个真正众矢之的的服务SQL编译、元数据拉取、队列管理、JDBC连接全在它里面。一旦HS2所在节点CPU被打爆所有租户的查询——不管在哪个YARN队列——都会跟着遭殃。所以做完了YARN队列隔离后我立刻着手给HiveServer2套Cgroups。这套做法其实就是把HS2进程关进一个资源笼子里限制它最多使用多少CPU、多少内存、允许多少线程/进程。为什么用systemd因为我们的HS2服务本身就是systemd管理的原生支持CPUQuota和MemoryMax参数配置简单修改后daemon-reload加restart就生效。不需要额外装cgroup工具也不需要自己写CPU隔离脚本。5.2 用systemd配置Cgroups完整步骤在/etc/systemd/system/hiveserver2.service的基础上增加以下配置[Unit] DescriptionApache Hive HiveServer2 Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userhive Grouphive EnvironmentFile/opt/hive/conf/hive-env.sh ExecStart/opt/hive/bin/hiveserver2 --hiveconf hive.server2.enable.doAsfalse Restarton-failure # CPU限制最多使用4核 CPUQuota400% # 内存限制物理内存最多12G MemoryMax12G MemorySwapMax0 # 限制线程总数防止连接风暴撑爆进程 TasksMax2048 # 在服务目录里启用写保护顺手加上也避免了HiveServer2被奇怪的写入操作干扰 ProtectSystemfull NoNewPrivilegestrue [Install] WantedBymulti-user.target解释一下参数CPUQuota400%表示这个服务下的所有线程加一起最多使用4个CPU核心。如果你的机器是16核那HS2最多吃1/4的CPU时间片。MemoryMax12G进程最多使用12G的物理内存。注意这里要综合HS2的JVM堆、堆外内存、Metaspace、线程栈来估算。我一般把JVM堆设成8G给堆外留4G余量。MemorySwapMax0禁止这个服务使用swap防止内存超限后通过swap硬撑但整体性能已经雪崩。这个配置在生产环境是很实用的。TasksMax2048限制线程数。HS2每来一个连接会创建若干线程如果没有限制一个恶意连接风暴能开出几千个线程现在这个数字被压死了。配置好之后执行systemctl daemon-reload systemctl restart hiveserver2 systemctl status hiveserver2验证是否生效systemd-cgtop # 查看cgroup维度资源占用可以看到hiveserver2.service这个cgroup当前的CPU/内存 cat /sys/fs/cgroup/system.slice/hiveserver2.service/cpu.max cat /sys/fs/cgroup/system.slice/hiveserver2.service/memory.max这两个文件里的值如果能对应上刚才配置的数值就说明Cgroups已经生效了。5.3 实测数据限流前后HS2表现对比这套配置上线后我专门做了一次压测对比。限流前我用一个复杂SQL20张大表JOIN 多级嵌套子查询连续提交多个会话HS2所在节点的CPU使用率瞬间从10%飙升到800%16核机器语句编译时间从几百毫秒劣化到几十秒执行队列堆积其他租户提交的简单SQL也全部卡在编译阶段表现就是Hue上跑一个select 1都要转圈半天。限流后同一批复杂SQL提交HS2的CPU使用率被稳定压在400%附近单条SQL的编译时间可能会有两三秒的上涨毕竟CPU受限了但其他租户的简单SQL依然能正常秒出。这就是典型的把少数人的复杂需求成本均摊到可控范围内。同时配合memory.maxHS2再也没出现过因为堆外内存失控导致Node被OOM Killer干掉的情况。之前有过一次JVM堆外内存泄露导致整个HS2进程被杀之后Cgroups直接把内存顶到12G就封死进程最多表现变慢绝不会拖垮物理机。5.4 Cgroups之外的配套手段连接与线程池限制Cgroups是釜底抽薪式的兜底但最好还是从HS2自身的配置上做第一道拦截。hive-site.xml里这几个参数很值得调!-- 单个用户最大并发连接数 -- property namehive.server2.limit.connections.per.user/name value10/value /property !-- HS2全局最大并发连接数 -- property namehive.server2.max.sessions.per.user/name value20/value /property !-- 执行编译的最大线程数 -- property namehive.server2.async.exec.threads/name value50/value /property这几个参数的价值在于它限制了请求进入HS2的量级防止通过连接数和任务数绕开Cgroups的CPU限制——毕竟CPU限制只影响使用多少核但如果你不限制线程数线程切换和锁竞争依然能把系统搞乱。Cgroups加HS2参数内外兼修才靠谱。6. 隔离效果怎么验证、资源纠纷怎么定责6.1 从调度器页面和命令行验证队列状态资源隔离做完别急着宣布搞定你先验证。YARN自带的ResourceManager UI页面是最直观的一层打开http://rm-host:8088/cluster/scheduler可以看到每个队列的Used Capacity、Configured Capacity和Maximum Capacity三个值。正常情况下当齐队列同时跑任务时每个队列的Used Capacity应该落在Configured和Maximum之间。如果某个队列长期顶在Maximum上说明它需求超配需要重新评估配额。如果某个队列Used很低但别的队列也提交不了任务就要看是资源碎片还是应用数量超限。命令行也有两个最常用的yarn application -list -appStates RUNNING # 看所有运行任务及其队列 yarn top # 看实时资源消耗Top用户/队列yarn top是我日常排查资源纠纷的利器。它能看到每个任务占用的内存MB、CPU vcore数、运行时长、所属队列和用户。一旦有租户投诉资源不够先跑一遍yarn top基本能定位是谁在哪个队列里吃了多少资源。6.2 通过Grafana和日志推进资源定责YARN页面能看当下但要定责必须看历史趋势。我一般会把YARN的指标接到Prometheus上重点监控以下几组yarn_queue_used_resources按队列维度的实时使用量yarn_queue_pending_apps等待中的应用数这个指标暴涨说明队列资源不足属于告警第一梯队yarn_app_memory_seconds任务累计消耗的内存*时间用它来算资源账单hiveserver2_execution_totalHS2维度每个SQL的执行耗时和编译耗时遇到跨队列互相指责的情况流程是这样的先通过YARN Timeline Server找到具体时间段内所有任务的开始/结束时间、CPU/内存峰值再结合hive.server2.log里的HiveSessionId和username字段把特定时间段的某条SQL跟某个队列的资源占用对上。有了这层数据让各租户负责人自己看是谁的任务在深夜把队列打满比口头吵架有说服力得多。6.3 多租户平台治理的几条实用经验隔离做到位只是解决了基础设施层面多租户平台真正要长期跑稳后面还得靠治理。总结几条我自己的经验。第一条资源配额不是拍脑袋定的要用一段时间的数据反推。新租户接入时先给一个保守配额跑一个月统计它每天的峰值用量、平均用量、99分位用量然后按平均用量30余量来调配额。这样既不会浪费资源也不会让租户天天戳你脊梁骨说配额不够。第二条建立大查询识别与熔断机制。我建议在HiveServer2前面或者调度层挂一套SQL预检规则对超过一定数据量预估的任务自动降级、限制并发或者直接提示用户走离线通道。Hive SQL引擎自带的hive.auto.convert.join和hive.tez.auto.reducer.parallelism虽然能缓解一部分问题但无法彻底防止SQL写歪。更有效的还是平台层去卡住任务量级。第三条简化临时用户的通道不要让他们直接进共享池。很多平台事故是临时来要数据的人写了一句不讲究的SQL直接用默认队列跑出来的。把临时用户的默认队列定向到一个低配额、低优先级的池子写再多垃圾SQL也有上限不会污染核心租户。第四条定期做资源容量规划。隔离不是把资源变多只是把资源分配得更合理。当多租户整体使用率超过70%、且多个队列长期顶在maximum-capacity上时该扩容就扩容不要指望压缩某个租户的配额来腾资源。在YARN上做资源隔离本质是给冲突建缓冲带而不是给超卖建遮羞布。7. 最后分享一点个人感受做多租户资源隔离技术上没有什么高深的东西YARN队列、Cgroups、HS2拆分每一层都是成熟方案。真正难的是想清楚你要为哪一类冲突买单。是先防止大任务打爆集群还是防止租户间互相干扰还是防止服务进程本身成为瓶颈这三类问题对应三套方案越往后越精细但每多一套方案运维复杂度也高一个台阶。我自己踩过最大的坑就是一开始想着一步到位把Cgroups、容器化、多HS2全上了结果配置复杂到没人能接手最后反而因为配置错误导致线上故障。后来学乖了先把YARN容量调度器配得明明白白顶上大半年等平台稳定了再把Cgroups一点一点加上去每加一项都有明确的监控指标做评估。如果你现在正被Hive集群的租户间资源冲突困扰我的建议很简单从容量调度器开始先保证看得见的公平把事故定性从没有隔离升级到隔离不彻底。等你把这一步吃透了后面再做Cgroups和HS2拆分都会顺很多。这套东西不复杂但它能在关键时刻让整个平台从随时要炸变成炸了也能控制在小范围这就值回所有配置时间了。
返回列表