hive导致表锁的SQL和租户信息获取
多租户平台存在同一个表有多个租户具有访问权限,hive提供锁机制,保障数据的安全。由此会引发由于某个租户占用锁时间较长,其他租户作业滞后,如果将导致表锁的SQL和租户信息截取到,可以提供给局方进行业务流程的优化,加快作业执行效率。本文档记录一个可实现的方法供参考
获取表锁信息
场景:hive使用分布式协调服务(Zookeeper)提供的分布式锁,hive底层由mapreduce执行,yarn统一资源调度,本文档由python语言实现
关键代码
# xxxx
# 2021/11/4 8:54
import configparser
import os
import time
from kazoo.client import KazooClient
import ConnMysqlTmpl
'''
#获取zookeeper集群信息
ZookeeperInfo.ini文件为:
[zookeeper-conn]
url=zk_host_name:port
'''
def zookeeper_info():
cf = configparser.ConfigParser()
pass1 = os.path.dirname(os.path.abspath('.'))
cf.read(pass1 + "/config/ZookeeperInfo.ini")
items = cf.items("zookeeper-conn")
list = []
for line in items:
list.append(line[1])
return list
'''
#定义一个zookeeper类,实现zk集群的链接和关闭
'''
class Zookeeper:
def connection(self,zk_url):
self.zk_url=zk_url
try:
self.conn_path=KazooClient(self.zk_url)
self.conn_path.start()
return self.conn_path
except Exception as e:
print(f"SSH连接异常, 错误如下: {e}")
def conn_close(self):
self.conn_path.stop()
print("已关闭Zookeeper连接...")
'''
#获取需要监控的表
HiveMonLockInfo文件格式随意,只要在zk中拿到需要监控的表路径即可
'''
def monitor_info():
filename = 'datainfo/HiveMonLockInfo'
if os.path.exists(filename):
with open(filename, 'r', encoding='utf8') as rfile:
lines = rfile.readlines()
return lines
else:
print("未找到文件:【 {0} 】信息,请联系后台管理员处理".format(filename))
'''
#获取表锁列表
'''
def get_lock():
zk=Zookeeper()
zk_info = zookeeper_info()
zk_conn=zk.connection(zk_info[0])
table_info=monitor_info()
locks = []
for table in table_info:
if zk_conn.exists("/hive_zookeeper_namespace/" + table.rstrip('\n')):
lock_name = zk_conn.get_children("/hive_zookeeper_namespace/" + table.rstrip('\n'))
for lock in lock_name:
if "LOCK" in lock:
locks.append("/hive_zookeeper_namespace/"+table.rstrip('\n')+"/"+