CDH: 5.14.2
Spark:1.6.0 (hive on spark没使用2.0+版本)
Hue:3.9.0
hive:1.1.0
由于公司查询使用的hue,hue上有impala & hive 。在做大数据量测试和查询的时候impala 会出现内存不足的情况,所以测试人员&分析师偶尔还是会使用hive(底层是spark ) 去进行处理,而其结果跑完后,并不会第一时间释放spark 资源。这就导致很多spark 资源被占用浪费的情况。
2.3 现象
而我们默认的hive查询配置是8G 10C 。但是有些查询还有配置几百个G 的hive on spark 查询,而这个查询如果资源一致不释放,就会导致很多的spark自动化任务资源等待,从而导致执行时间被延长…
看到一个帖子:传送门
基本就是说这不是一个bug 而是一个资源的重复利用可以调节hive session的超时时间 hive.server2.idle.session.timeout即可以解决。但在当前使用的版本中达到hive session的超时时间(配置的两小时) 依旧会存在。
进一步debug 发现,这个现象只出现在hue 查询hive 时才会存在,且占用队列为users用户队列。
其他情况下都不会发生该现象。而尝试hue 关闭session 按钮也不能解决这个问题,资源还是被占用。后来想手动实现kill 超时的任务,简单看了下yarn 的rest api
GET http:///ws/v1/cluster/apps
发现可以拿到每个Application的运行情况,所以尝试python 脚本去定时便利的user队列,然后拿到Application_id ,然后再cmd 执行
yarn application -kill {Application_id}
3.3 脚本代码
import requests
import time
import os
import logging
now_t = int(round(time.time() * 1000))
URL = f"http://host_ip:8088/ws/v1/cluster/apps"
response = requests.get(URL)
yarn_infos = response.json().get("apps").get("app")
for app_info in yarn_infos:
if "root.users" in app_info.get("queue", None) and app_info.get("state", None) == "RUNNING":
app_id = app_info.get("id", None)
state = app_info.get("state", None)
queue = app_info.get("queue", None)
started_time = app_info.get("startedTime", None)
diff_time = (now_t-started_time)/1000/60/60
if diff_time > 2:
os.system(f"yarn application -kill {app_id}")
logging.info(f"users 队列kill任务app_id:{app_id},state:{state},queue:{queue},started_time:{started_time},now_time:{now_t}")
else:
logging.info(f"users队列正常任务app_id:{app_id},state:{state},queue:{queue},started_time:{started_time},now_time:{now_t}")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)