明天在应用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