Hive on Tez Reduce阶段作业失败报InterruptedException问题咨询
环境
- hive 3.1.2
- tez 0.10.2
- hadoop 3.2.1
问题详情
我当前搭配Hive LLAP使用Tez,Tez已按照官方文档完成部署。目前LLAP运行正常,但Tez作业持续失败:相同的查询在container模式下可以正常运行,一旦作业执行到切换为Reduce作业的阶段就会持续报错。
作业运行状态如下:
---------------------------------------------------------------------------------------------- VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED ---------------------------------------------------------------------------------------------- Map 1 ......... llap RUNNING 59 56 0 3 134 8 Reducer 2 .... llap RUNNING 51 36 0 15 0 124 ---------------------------------------------------------------------------------------------- VERTICES: 00/02 [=====================>>-----] 83% ELAPSED TIME: 12.35 s ----------------------------------------------------------------------------------------------
作业未出现OOM异常,排查错误日志发现进入Reduce操作时会反复抛出如下异常:
2021-09-15T10:46:19,515 ERROR [TezTR-470960_251_1_1_32_0 (1631527470960_0251_1_01_000032_0)] tez.TezProcessor: java.lang.InterruptedException at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2048) at org.apache.tez.runtime.InputReadyTracker$InputReadyMonitor.awaitCondition(InputReadyTracker.java:147) at org.apache.tez.runtime.InputReadyTracker.waitForAllInputsReady(InputReadyTracker.java:107) at org.apache.tez.runtime.api.impl.TezProcessorContextImpl.waitForAllInputsReady(TezProcessorContextImpl.java:138) at org.apache.tez.runtime.api.impl.TezProcessorContextImpl.waitForAllInputsReady(TezProcessorContextImpl.java:133) at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordProcessor.init(ReduceRecordProcessor.java:122) at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:266) at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:250) at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:381) at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:82) at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:69) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:69) at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:39) at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36) at org.apache.hadoop.hive.llap.daemon.impl.StatsRecordingThreadPool$WrappedCallable.call(StatsRecordingThreadPool.java:110) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
补充说明:使用场景下Tez 0.10.1存在jetty和snappy相关的特定问题,因此当前部署的是GitHub上发布的0.10.2版本。
解决方案
排查步骤
- 校验配置项
tez.am.llap.daemon.port是否和Hive LLAP的RPC端口一致,端口不匹配会导致Reduce阶段拉取Map端输出时触发等待超时被主动打断。 - 检查
tez.task.timeout以及hive.llap.task.timeout配置值是否过短,Reduce需要等待全部Map任务输出就绪才能开始执行,当等待时间超出超时阈值时就会抛出该中断异常。 - 排查所有LLAP节点的网络连通性,确认LLAP默认通信端口(通常为10000、15002)没有被防火墙拦截,Reduce节点拉取Map分片时网络不通也会触发等待超时。
修复方案
- 临时验证:将
hive.llap.execution.mode设置为only_map,重新提交作业观察是否能正常完成,如果作业正常运行则可确认是Reduce阶段LLAP通信问题。 - 配置优化:在tez-site.xml和hive-site.xml中新增如下配置,延长等待超时阈值,调整Reduce启动时机:
<!-- tez-site.xml 新增配置 --> <property> <name>tez.runtime.input.ready.wait.timeout.ms</name> <value>300000</value> </property> <property> <name>tez.am.reduce.slowstart.completed.maps</name> <value>0.95</value> </property> <!-- hive-site.xml 新增配置 --> <property> <name>hive.llap.task.timeout</name> <value>300000</value> </property>
- 版本兼容修复:由于你使用的是未正式发布的Tez 0.10.2快照版本,可保留Tez 0.10.1正式版基础上单独替换jetty和snappy依赖包,避开快照版本输入等待逻辑的已知bug。
内容的提问来源于stack exchange,提问作者hoon
相关产品推荐
相关产品推荐

