CDH升级CDP以后,从cm页面上查询用户的队列,总感觉没有以前方便。现在搜索列队名,符合条件的队列会高亮显示,但是如果符合条件的队列不在当前页,你就得一直点那个More Queues,总之用着没有以前顺手了。
因为工作的需要,我查看和修改yarn 队列资源比较频繁,每次通过页面操作多个用户的资源时,我都有一种要砸键盘的冲动。懒,是更新生产力的重要推动力。于是乎,决定动手写一个python脚本,希望借助先进生产力,解放自己的双手……
通过Python的requests模块实现,没有安装的先自行安装。
import requests
确定cm的ip,端口,用户名,密码,集群名称和接口地址。可以用抓包工具获取接口地址,首先定义个queues的类,初始化以上参数
class queues:
#初始化配置
def __init__(self):
self.ip = "192.168.0.1"
self.port = "7180"
self.username = "admin"
self.passwd = "admin123"
self.cluster_name = "Cluster"
self.login_api = "/cm/login"
self.login_url = f"http://{self.ip}:{self.port}{self.login_api}"
self.queue_api = f"/cm/clusters/{self.cluster_name}"
self.queue_url = f"http://{self.ip}:{self.port}{self.queue_api}"
self.data = {"username": self.username, "password": self.passwd}
self.session = requests.Session()
self.login()
初始化相关参数,接下来就是登录,为了请求之间保持状态,使用了session机制。
def login(self):
res = self.session.post(self.login_url, data = self.data)
if res.ok:
print("Login success")
else:
exit("Failed login,check your username or passwd!")
def write_ini(self, file_path, ini_msg, type):
self.path = file_path
self.ini_msg = ini_msg
self.type = type
with open(f"{self.path}", self.type) as fs:
fs.write(f"{self.ini_msg}")
登录成功后,我们就可以调用queue接口获取所有的队列,因为我把用户的队列都建在了父队列,也就是root的下面,所以每个用户的队列都是root队列的子队列。
def get_queues(self):
res = self.session.get(self.queue_url)
if res.ok:
data_js = res.json()
sub_queues = data_js["queues"]
return sub_queues
def get_users_queue(self, data_js):
self.data_js = data_js
queues_data = []
#清空文件
self.write_ini(self.data_js, "", "w")
for i in range(len(self.data_js)):
if self.data_js[i]["parentQueueName"] == "root":
queue_name = f"[yarn_{data_js[i]['name'].strip()}]"
properties = self.data_js[i]["properties"]
name = self.data_js[i]['queuePath'].strip()
max_cores = self.data_js[i]['configuredMaxResource']['vcores']
max_memory = self.data_js[i]['configuredMaxResource']['memory_mb']
if properties['queueAcls.ADMINISTER_QUEUE'] != " ":
admin_group = properties['queueAcls.ADMINISTER_QUEUE'].strip()
else:
user = self.data_js[i]['name'].split("_")[0].strip()
admin_group = f"{user}_g"
if properties['queueAcls.SUBMIT_APP'] != " ":
submit_group = properties['queueAcls.SUBMIT_APP'].strip()
else:
user = self.data_js[i]['name'].split("_")[0].strip()
submit_group = f"{user}_g"
#生成写入ini文件的相关内容
ini_msg = f"{queue_name}\n" \
f"name = {name}\n" \
f"min_cores = {min_cores}\n" \
f"min_memory = {min_memory}\n" \
f"max_cores = {max_cores}\n" \
f"max_memory = {max_memory}\n" \
f"admin_group = {admin_group}\n" \
f"submit_group = {submit_group}\n"
print(f"开始写入{queue_name}")
self.write_ini(self.file_path, ini_msg, "a")
以上的登录接口和queues 接口可以在登录和操作queues的时候用抓包工具抓取。