生产背景
presto on yarn已经测试完毕,准备上生产,生产环境严格,不允许有任何影响生产的因素。生产共50个节点,要求是固定10台节点跑presto,且不能影响原有的mapreduce(无标签application)程序,即50台节点也必须都能被mapreduce程序分配到。在之前的测试中,固定10台节点中一台打coordinator标签,9台打worker标签,启动presto。存在一个问题,就是mapreduce只能跑在除presto节点的另外40台节点上,这必须解决。
方案思路
周一开始去查看node label相关的配置,发现在创建node label时,可以用exclusive=false(默认为true,表示是独占标签,意思是具有该label的节点只能被指定了该label的application使用,不能被其他label的application使用,比如不能被未指定label的application调度到)属性,将label设置成非独占标签,此时该标签可以被no label的application调度,即未指定label的application可以同时使用no label节点和该非独占标签的节点。按照该情况,只要将worker标签设置成非独占标签,原来的mapreduce仍然可以使用到那9台(除去coordinator节点)固定的worker节点。即达到了需求。于是按照这样做去打非独占标签。
结果打exclusive=false的标签报错,查看多方资料,似乎是跟hadoop版本相关。我的版本是hdp2.7.1,而node label稳定版本是2.8.x。那么这个方案就被否定了。之后又在标签之间徘徊思考,看能否通过标签的变化来达到需求,但总没有想到办法。
逆向思路
接连尝试了3天,周四早上开车上班的途中突然灵光一闪,之前考虑的都是给那固定的10台打标签,是否可以反过来,给另外40台打标签呢,接着思路下去。想到了如下方案:
a 假定有101,102,103...110 十台机器。 101打coordinator标签,其余需要有102,103,104,105 四台跑worker节点
b 逆向,先将106-110打worker(随便命名一个,不一定是worker)标签,然后用no label标签启动presto的worker,此时presto worker就泡在102,103,104,105固定节点
c 将106-110的worker标签清空,此时除101 coordinator外其他节点都是no label节点,mapreduce程序就能跑在除101 coordinator的其他节点。
非完美的解决了该问题。
验证过程
需求:presto:coordinator跑在018,7台worker泡在011,012,013,014,015,019,020.
mapreduce:需要跑在除018的所有机器上
按照需求如下打节点标签,018打coordinator,003,005,006,008打worker节点
修改presto resources-default.json,将worker节点的label设置为空
启动presto,节点设置与期望的一致
清空worker节点标签
跑一个mapreduce任务,查看任务是否能泡在除018所有节点
map 159个,reduce 1个
map节点