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/apache/hive/hive-3.1.2/apache-hive-3.1.2-src.tar.gz)

将源码下载以后,按照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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianmoQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值