在Hive 日常跑批的情况下,如出现数据倾斜严重,或者运行未经优化的SQL时可能导致Hive 任务运行时长超过预期并且长时间占用资源池队列的大量资源,从而导致其他任务因资源不够的情况而延迟。对于这种情况,用户可能期望该作业失败,来保证后续作业的运行。本文主要讲述如何设置Hive 任务的超时时间以及与其关联的参数,合理的配置参数可以减少上述问题的发生。
在配置任务超时的过程中主要用到hive.server2.session.check.interval和hive.server2.idle.operation.timeout这两个参数。所有相关参数的说明如下:
hive.server2.idle.session.timeout
hive.server2.session.check.interval
hive.server2.idle.session.check.operation
hive.server2.idle.operation.timeout
以下用例结合了上述示例中的三个设置值:
CM
>Hive on Tez
> 配置
> 搜索hive.server2.session.check.interval,默认值15分钟,最低配置为3秒。如下图,保存配置后进行重启HiveServer2 服务进行生效。
注意: hive.server2.session.check.interval该参数需要在服务级别设置,通过在session 中set 该参数不生效。
hive.server2.idle.operation.timeout参数可以通过服务级别全局配置,如下图,也可以通过
set hive.server2.idle.operation.timeout=-20000;
来设置,默认单位毫秒。
注意: 该参数在7.1.7 SP1 之前不在runtime 白名单中,如在CDP7.1.7 SP1的版本中运行默认会报错,提示:Error: Error while processing statement: Cannot modify hive.server2.idle.operation.timeout at runtime. It is not in list of params that are allowed to be modified at runtime (state=42000,code=1)。 处理方式请参考文档:https://my.cloudera.com/knowledge/quotError-while-processing-statement-Cannot-modify-a-at?id=313269
当把hive.server2.session.check.interval 间隔时间设置为3秒,分别通过
set hive.server2.idle.operation.timeout=-2000; (2秒)
set hive.server2.idle.operation.timeout=-20000;(20秒)
来进行验证如下,可以发现设置为任意情况下2秒超时的作业运行很快就提示Invalid OperationHandle: OperationHandle异常,而设置为20秒的则可以正常运行
在HiveServer2 日志中可以看到如下报错:
2022-12-01 15:49:03,924 WARN org.apache.hive.service.cli.thrift.ThriftCLIService: [HiveServer2-Handler-Pool: Thread-91]: Error getting operation status:
org.apache.hive.service.cli.HiveSQLException: Invalid OperationHandle: OperationHandle [opType=EXECUTE_STATEMENT, getHandleIdentifier()=3351410c-2137-47b5-b0a6-3324222dc553]
at org.apache.hive.service.cli.operation.OperationManager.getOperation(OperationManager.java:180) ~[hive-service-3.1.3000.7.1.7.1044-1.jar:3.1.3000.7.1.7.1044-1]
at org.apache.hive.service.cli.thrift.ThriftCLIService.getProgressedPercentage(ThriftCLIService.java:489) ~[hive-service-3.1.3000.7.1.7.1044-1.jar:3.1.3000.7.1.7.1044-1]
at org.apache.hive.service.cli.thrift.ThriftCLIService.GetOperationStatus(ThriftCLIService.java:737) [hive-service-3.1.3000.7.1.7.1044-1.jar:3.1.3000.7.1.7.1044-1]
通过合理的超时参数的配置,可以及时的将存在问题的Hive SQL 进行超时处理,当然在设置参数时也需要考虑正常作业运行的时间,以及可能出现的因资源不够的待定时间。对相关的作业进行合理的参数超时配置,合理的利用资源,从而提升整体作业运行效率。