乐趣区

关于hive:Hive-On-Tez自定义Job-Name

明天在应用 Hive On Tez 的时候发现一个问题,那就是咱们无奈设置 Tez 运行在 Yarn 下面的 Job Name。依照设置 MR 失常的步骤来设置 Job Name 发现也是有效的。

这让我很蛊惑,于是想了一下是不是因为 TezSession 的时候曾经写死了导致的,然通过将 Hive 的源码下载下来(我用的是 Hive-3.1.2 的源码,下载地址:https://mirror.bit.edu.cn/apa…)

将源码下载当前,依照 MR 的源码 HiveSession 来推理,想的应该是 TezSession,于是去查找这个类,现实总是很好的,然而事实往往相同,于是又想到了有一个SessionState 的类,于是又衍生一个想法是不是也有一个叫 TesSessionState 的类呢?而后查找源码发现还真的有这个类,那么咱们初步定位到了在这个类中,而后开始浏览该类 ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TezSessionState.java 的源码发现:

final TezClient session = TezClient.newBuilder("HIVE-" + sessionId, tezConfig)
    .setIsSession(true).setLocalResources(commonLocalResources)
    .setCredentials(llapCredentials).setServicePluginDescriptor(servicePluginsDescriptor)
    .build();

在源码中写死了 Job Name 是 "HIVE-" + sessionId 也就是咱们在页面中看到的HIVE- 随机生成的 UUID,咱们自定义 Job Name 也很简略,批改源码如下:

String tezJobName = tezConfig.get("tez.job.name", "HIVE-" + sessionId);

LOG.info("Tez Job Name" + tezJobName);

final TezClient session = TezClient.newBuilder(tezJobName, tezConfig)
    .setIsSession(true).setLocalResources(commonLocalResources)
    .setCredentials(llapCredentials).setServicePluginDescriptor(servicePluginsDescriptor)
    .build();

批改源码后执行以下 maven 命令进行源码从新编译

mvn clean package -DskipTests -U -X

留神:如果批改了 maven 下载仓库为国内镜像的话,肯定要将 maven 地方仓库加到 pom.xml 文件中(根目录的)否则会呈现下载 jar 问题

将编译后的 ql/target/hive-exec-3.1.2.jar 替换原有的 Hive 中的 lib 依赖即可!!!

此时咱们应用 set tez.job.name=tezAppName; 即可,在 Yarn 界面中即可看到 Application Name 曾经改成了咱们自定义的名称。

应用hive --hiveconf tez.job.name=tezAppName

退出移动版