前面遇到过一次因为 Hive 中表被锁住了,导致定时任务一直失败。这两天又出现了表被锁,原因是连接 hiveserver2 过于频繁, mysql 连接被打满,引发的连锁反应,导致我们的小时任务一直失败,下午重点注意到这个问题,才解决好。
在执行 insert into 或 insert overwrite 任务时,中途手动将程序停掉,会出现卡死情况(无法提交MapReduce),只能执行查询 *** 作,而 drop insert *** 作均不可 *** 作,无论执行多久,都会保持卡死状态。
查看 Hive 的中死锁,可以使用 show locks [table] 来查看。
可以看到里面的那个Type下的EXCLUSIVE,这是一种互斥锁,需要解决,否则后续的查询和插入任务都会影响。
hive存在两种锁,共享锁 Shared (S) 和互斥锁 Exclusive (X)
锁的基本机制是:
触发共享锁的 *** 作是可以并发执行的,但是触发互斥锁,那么该表和该分区就不能并发的执行作业了。
对于上面的情况,使用解锁命令:
注意 : 表锁和分区锁是两个不同的锁 ,对表解锁,对分区是无效的,分区需要单独解锁
查看表被锁的情况:
常规解锁方法:
高版本hive默认插入数据时,不能查询,因为有锁
解锁之路通常不是一帆风顺的,可能会遇到各种问题,笔者是在 Hive2.1.1 下面测试,比如:
这个命令无法执行,说 LockManager 没有指定,这时候需要执行命令:
这样重新执行,命令就可以执行了
如果还!是!不!行,终极方法,可以直接去mysql元数据执行:
查到所有的锁,然后根据条件把对应的锁删掉,这个锁住的表即可释放出来了。
注意 : 表名和字段都需要大写 。
通过这种办法,通常可以彻底解决锁的问题。
(已安装则跳过)
yum -y install wget
安装这个包后,会获得两个mysql的yum repo源:
修改配置文件/etc/my.cnf,添加
然后,重启服务:
MYSQL就可以无密码登录了
删除配置文件my.cnf中的skip-grant-tables
重启服务: systemctl restart mysqld
使用密码登录: mysql -uroot -p
注:需要关闭centos防火墙
查看版本号:
mysql -V
启动mysql服务
systemcl start mysqld.service
停止mysql服务
systemctl stop mysqld.service
重启mysql服务
systemctl restart mysqld.service
查看mysql服务当前状态
systemctl status mysqld.service
设置mysql服务开机自启动
systemctl enable mysqld.service
停止mysql服务开机自启动
systemctl disable mysqld.service
rpm -qa|grep mariadb
rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64
输出内容最后root@localhost:XXXXXXXX中的XXXX为初始密码
编写后保存
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)