hive 并行执行 conditionalTask 时出现线程不安全问题,导致部分stage miss

477 阅读2分钟

最近公司有同事反馈,提交到hive server2的create table as 作业出现状态是成功的,但是表却未创建成功,导致下游任务报table not found错误,后面用户自己重跑一次就成功了。我们初步排查发现metastore也未收到对应的建表请求,对此怀疑问题应该出现在hive server测。对于同一个作业,分别出现建表不成功和成功的case,我们通过对hive server的日志分析,有个比较关键的stage3没有跑,所以导致后面的move task,ddl task都没跑。 正常的stage dependency: 错误的stage dependency: 第一次执行的stage数量比第二次少,所有怀疑hive server在执行的过程中可能出现miss stage的问题。社区也有一个类似的问题issues.apache.org/jira/browse… ,主要思路就是在所有stage执行完之后,check所有的rootTask是否done,否则就failfast。由于用户的这个case并不是每次都能复现,对此我们首先把这个patch打上,避免下次再次出现影响用户任务,同时加了一些关键日志,当下次这种case再出现时,根据日志定位rc。

patch打上之后,为了能快速复现,就写了个脚本不断提交用户的那个作业,2个小时后复现了,然后根据加的日志发现stage3没执行的原因是,多个ConditionalTask并发remove children task的时候存在线程不安全问题,当task没有被remove掉也未执行成功时,后面的ddl task也就不会被加入到running队列,从而未被执行。对此我们加了个逻辑判断,当执行ConditionalTask时,采用serial mode方式执行,避免掉掉线程不安全问题。

出问题的位置: 解决方法: