【Hive】云任务大量卡住故障分析

项目场景:

上一章节我们简单介绍到了JVM调优相关的知识,本章节结合日常故障处理进一步说明相关的使用


问题描述

在云上,hive任务出现大面积卡住的现象,但并无任何报错信息,具体如下:
在这里插入图片描述


原因分析:

- 考虑hivemetastore故障:

经过很多元数据操作测试,并未发现异常,予以排除。

- 考虑hiveserver2连接数超限问题:

经排查hiveserver2虽然有189个连接数,但并未超过设置的hive.server2.thrift.max.worker.threads上限,予以排除。

- 考虑hiveserver2的JVM问题:

经观察资源使用正常,并没有触发该问题的可能,予以排除,当时的jvm使用情况如下:

在这里插入图片描述

  • 考虑锁机制相关问题:

经过抓取多时段堆栈信息,发现任务运行过程中,产生了许多BLOCKED以及WAITING,予以高度关注。
首先无论一个APP产生多少个JOB执行,这些JOB都会被分配到同一个线程中串行执行,直至任务结束。

在这里插入图片描述
堆栈信息中显示,该线程由于一直在等待<0x0000000788597b0>锁,处于边界,导致死锁
在这里插入图片描述
再继续查找持有<0x0000000788597b0>锁的线程,经过多次采集信息发现,该持有锁的线程,一直持有,不释放
在这里插入图片描述
根据该线程相关信息,DEBUG追踪相关代码,发现该while循环一直不结束,永远跳不出来,处于死循环状态。
在这里插入图片描述
根据该线索,进一步排查到底哪里使用了该方法,启动了线程呢?根据测试的SQL特点和不同任务对比,定位到MapredLocalTask这个class类。
在这里插入图片描述
在这里插入图片描述
根据MapredLocalTask的具体执行逻辑,主要涉及到mapjoin的问题,尝试关闭mapjoin功能(set hive.auto.convert.join=false;),再次运行任务,奇迹发生了,任务可以执行成功。
在这里插入图片描述

总结:

结合原理可知,Map Join的适用大表Join小表及不等值的链接操作。
关于小表的大小,由参数 hive.mapjoin.smalltable.filesize来决定,该参数表示小表的总大小,默认值为25000000字节,即25M。实际中此参数允许的最大值可以修改,但是一般最大不能超过1GB
Hive0.7之前,需要使用hint提示/+mapjoin(table)/才会执行MapJoin,否则执行Common Join,但在0.7版本之后,默认自动会转换Map Join,由参数 hive.auto.convert.join来控制,默认为true。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值