Hive On Tez自定義Job Name

qianmoQ發表於2020-09-24

今天在使用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

相關文章