配置Hive Beeline高可靠性
操作场景
- 在批处理任务运行过程中,beeline客户端由于网络异常等问题断线时,Hive能支持beeline在断线前已经提交的任务继续运行。当再次运行该批处理任务时,已经提交过的任务不再重新执行,直接从下一个任务开始执行。
- 在批处理任务运行过程中,HiveServer服务由于某些原因导致宕机时,Hive能支持当再次运行该批处理任务时,已经成功执行完成的任务不再重新执行,直接从HiveServer2宕机时正在运行的任务开始运行。
本章节适用于MRS 3.x及后续版本。
操作示例
- beeline启动断线重连功能。
beeline -e "${SQL}" --hivevar batchid=xxxxx
- beeline kill正在运行的任务。
beeline -e "" --hivevar batchid=xxxxx --hivevar kill=true
- 登录beeline客户端,启动断线重连机制。
登录beeline客户端后,执行“set hivevar:batchid=xxxx”
使用说明:
- 其中“xxxx”表示每一次通过beeline提交任务的批次号,通过该批次号,可以识别出先提交的任务。如果提交任务时不带批次号,该特性功能不会启用。“xxxx”的值是执行任务时指定的,如下所示,“xxxx”值为“012345678901”:
beeline -f hdfs://hacluster/user/hive/table.sql --hivevar batchid=012345678901
- 如果运行的SQL脚本依赖数据的失效性,建议不启用断点重连机制,或者每次运行时使用新的batchid。因为重复执行时,可能由于某些SQL语句已经执行过了不再重新执行,导致获取到过期的数据。
- 如果SQL脚本中使用了一些内置时间函数,建议不启用断点重连机制,或者每次运行时使用新的batchid,理由同上。
- 一个SQL脚本里面会包含一个或多个子任务。如果SQL脚本中存在先创建再删除临时表的逻辑,建议将删除临时表的逻辑放到脚本的最后。假定删除临时表子任务的后续子任务执行失败,并且删除临时表的子任务之前的子任务用到了该临时表;当下一次以相同batchid执行该SQL脚本时,因为临时表在上一次执行时已被删除,则会导致删除临时表的子任务之前用到该临时表的子任务(不包括创建该临时表的子任务,因为上一次已经执行成功,本次不会再执行,仅可编译)编译失败。这种情况下,建议使用新的batchid执行脚本。
参数说明:
- zk.cleanup.finished.job.interval:执行清理任务的间隔时间,默认隔60s执行一次。
- zk.cleanup.finished.job.outdated.threshold:节点的过期时间,每个批次的任务都会生成对应节点,从当前批次任务的结束时间开始算,如果超过60分钟,则表示已经过期了,那么就清除节点。
- batch.job.max.retry.count:单批次任务的最大重试次数,当单批次的任务失败重试次数超过这个值,就会删除该任务记录,下次运行时将从头开始运行,默认是10次。
- beeline.reconnect.zk.path:存储任务执行进度的根节点,Hive服务默认是/beeline。
- 其中“xxxx”表示每一次通过beeline提交任务的批次号,通过该批次号,可以识别出先提交的任务。如果提交任务时不带批次号,该特性功能不会启用。“xxxx”的值是执行任务时指定的,如下所示,“xxxx”值为“012345678901”: