IT明哥

V1

2022/09/30阅读:30主题:草原绿

如何在不同引擎如 hive on mr/spark/tez 下指定HIVE作业名

如何在不同引擎如 hive on mr/spark/tez 下指定HIVE作业名?

大家知道,HIVE作业名(即HIVE 作业在 Yarn webui上显示的 yarn application name),在用户没有特比指定时,在不同引擎下其默认名称是不同的,作业名大体形式如下:

  • hive on mr: hive 作业名由 SQL 作业的实际内容截断而来,如: select count(1) from ...da_basic_info_simple (Stage-1)
  • hive on spark:hive 作业名包含 sessionId,与SQL内容无关,如:Hive on Spark (hiveSessionId = 01c37ef8-8175-433a-94f3-92702203140d) - hive on tez:hive 作业名包含sessionId,与SQL内容无关,如: HIVE-a6ec3f4a-7d97-48e6-b24d-37a895ac3f74

为便于排查问题,我们经常会指定使用某个有业务含义的名称作为 HIVE 作业名,此时需要注意,在不同引擎下,需要使用不同参数来指定HIVE作业名称:

  • hive on mr: 使用参数 mapred.job.name/mapreduce.job.name (works only for hive on mr);
  • hive on spark: 使用参数 spark.app.name (works only for hive on spark);
  • hive on tez: 使用参数 tez.job.name (works only for hive on tez)

各个引擎由于执行机制的不同,又有以下细节组要注意:

  • hive on mr 模式下,用户登录并与hiveserver2建立 session 连接后,可以先后提交多个SQL,每个SQL在底层执行时对应 0/1/N 个 mr 作业,相应地也会启动 0/1/N 个yarn application,所以可以通过 set mapred.job.name/mapreduce.job.name = xxx 为提交的每个SQL动态指定不同的作业名;
  • hive on spark 模式下,用户登录并与hiveserver2 建立 session 连接后,可以先后提交多个SQL,每个SQL在底层执行时对应 0/1/N 个 spark 作业,但由于这些 spark 作业可以复用同一个 spark 集群,相应地也只需要启动1个spark 集群,所以只能在提交SQL前通过 set spark.app.name = xxx 指定 spark 应用名(当然也可以登录hiveserver2之前静态指定参数spark.app.name);(该spark on yarn集群默认启用了动态资源分配机制 spark.dynamicAllocation.enabled所以会动态伸缩executor个数,且该spark on yarn 集群只有在客户端长时间没有提交新SQL作业时才会超时退出,超时时长由参数 hive.spark.session.timeout.period控制,默认30分钟);
  • hive on tez 模式下,用户登录并与hiveserver2 建立 session 连接后,可以先后提交多个SQL,每个SQL在底层执行时对应 0/1/N 个 tez 作业,但由于这些 tez 作业可以复用同一个 tez 集群,相应地也只需要启动1个tez 集群,所以只能在提交SQL前通过 set tez.job.name = xxx 指定 tez 应用名(当然也可以登录hiveserver2之前静态指定参数 tez.job.name);(有的集群可能会配置启动 tez default sessions,此时用户没有提交SQL前,tez 集群就已经启动了);

最后,在排查 HIVE 作业问题时,除了定位到对应的yarn 应用并使用命令如 yarn logs -applicationId application_1664356870033_1618 查看 YARN 应用的相关日志,由于用户提交的每个 SQL 在hiveserver2中都对应一个queryId,如 queryId=hive_20220930143659_5ebc6adf-7702-4c0b-b108-992be45116d9,所以我们还可以通过 gueryID 搜索查看 hiveserver2 中的相关日志。

相关参数:

  • hive.session.id: session identifier
  • tez.job.name: default "HIVE-%s", This named is used by Tez to set the job name. This name in turn will appear on the Yarn UI representing the Yarn Application Name. And The job name may be a Java String.format() string, to which the session ID will be supplied as the single parameter.
  • hive.query.name: default null,this named is used by Tez to set the dag name. This name in turn will appear on the Tez UI representing the work that was done.( 注意:the value set for hive.query.name will not show up in Resource Manager UI instead it will show in Tez UI because Hive reuses YARN applications to run multiple queries by different users;RM UI displays the yarn application name and in Hive/tez we reuse applications heavily so there is no 1-1 relationship between application and DAG or query)
  • hive.server2.tez.initialize.default.sessions/hive.server2.tez.default.queues/hive.server2.tez.sessions.per.default.queue/hive.server2.tez.session.lifetime/hive.server2.tez.interactive.queue/hive.server2.tez.queue.access.check/hive.server2.tez.sessions.custom.queue.allowed

分类:

后端

标签:

大数据

作者介绍

IT明哥
V1