日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

hive on tez踩坑记2-hive0.14 on tez

發(fā)布時(shí)間:2025/7/14 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hive on tez踩坑记2-hive0.14 on tez 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在測(cè)試hive0.14.0 on tez時(shí)遇到的問(wèn)題比較多:
1.在使用cdh5.2.0+hive0.14.0+tez-0.5.0測(cè)試時(shí),首先遇到下面的問(wèn)題

java.lang.NoSuchMethodError:?org.apache.tez.dag.api.client.Progress.getFailedTaskAttemptCount()Iat?org.apache.hadoop.hive.ql.exec.tez.TezJobMonitor.printStatusInPlace(TezJobMonitor.java:613)at?org.apache.hadoop.hive.ql.exec.tez.TezJobMonitor.monitorExecution(TezJobMonitor.java:311)at?org.apache.hadoop.hive.ql.exec.tez.TezTask.execute(TezTask.java:167)at?org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:160)at?org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:85)at?org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1604)at?org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1364)at?org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1177)at?org.apache.hadoop.hive.ql.Driver.run(Driver.java:1004)at?org.apache.hadoop.hive.ql.Driver.run(Driver.java:994)at?org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:247)at?org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:199)at?org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:410)at?org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:783)at?org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)at?org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)at?sun.reflect.NativeMethodAccessorImpl.invoke0(Native?Method)at?sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at?sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at?java.lang.reflect.Method.invoke(Method.java:597)at?org.apache.hadoop.util.RunJar.main(RunJar.java:212)

通過(guò)堆棧可以看出是在tez job提交之后報(bào)的錯(cuò),在org.apache.hadoop.hive.ql.exec.tez.TezTask中
job通過(guò)submit方法提交后,實(shí)例化一個(gè)TezJobMonitor 對(duì)象,用來(lái)記錄tez job的運(yùn)行情況:

//?submit?will?send?the?job?to?the?cluster?and?start?executing client?=?submit(jobConf,?dag,?scratchDir,?appJarLr,?session, additionalLr,?inputOutputJars,?inputOutputLocalResources); //?finally?monitor?will?print?progress?until?the?job?is?done TezJobMonitor?monitor?=?new?TezJobMonitor(); rc?=?monitor.monitorExecution(client,?ctx.getHiveTxnManager(),?conf,?dag);

TezJobMonitor.monitorExecution方法中:

boolean?isProfileEnabled?=?conf.getBoolVar(conf,?HiveConf.ConfVars.TEZ_EXEC_SUMMARY);?//hive.tez.exec.print.summary,默認(rèn)為false boolean?inPlaceUpdates?=?conf.getBoolVar(conf,?HiveConf.ConfVars.TEZ_EXEC_INPLACE_PROGRESS);?//hive.tez.exec.inplace.progress,默認(rèn)為true boolean?wideTerminal?=?false; boolean?isTerminal?=?inPlaceUpdates?==?true???isUnixTerminal()?:?false; //?we?need?at?least?80?chars?wide?terminal?to?display?in-place?updates?properly if?(isTerminal)?{if?(getTerminalWidth()?>=?MIN_TERMINAL_WIDTH)?{wideTerminal?=?true;} } boolean?inPlaceEligible?=?false; if?(inPlaceUpdates?&&?isTerminal?&&?wideTerminal?&&?!console.getIsSilent())?{inPlaceEligible?=?true; } //進(jìn)入一個(gè)while循環(huán),判斷?job的狀態(tài),并運(yùn)行printStatusInPlace或者printStatus方法(其中printStatus最終調(diào)用getReport方法) ...... case?RUNNING:if?(!running)?{perfLogger.PerfLogEnd(CLASS_NAME,?PerfLogger.TEZ_SUBMIT_TO_RUNNING);console.printInfo("Status:?Running?("?+?dagClient.getExecutionContext()?+?")\n");startTime?=?System.currentTimeMillis();running?=?true;}if?(inPlaceEligible)?{printStatusInPlace(progressMap,?startTime,?false,?dagClient);//?log?the?progress?report?to?log?file?as?welllastReport?=?logStatus(progressMap,?lastReport,?console);}?else?{lastReport?=?printStatus(progressMap,?lastReport,?console);}break;

比如在printStatusInPlace方法中:

SortedSet<String>?keys?=?new?TreeSet<String>(progressMap.keySet()); int?idx?=?0; int?maxKeys?=?keys.size(); for?(String?s?:?keys)?{idx++;Progress?progress?=?progressMap.get(s);final?int?complete?=?progress.getSucceededTaskCount();final?int?total?=?progress.getTotalTaskCount();final?int?running?=?progress.getRunningTaskCount();final?int?failed?=?progress.getFailedTaskAttemptCount();?//?會(huì)調(diào)用Progress類getFailedTaskAttemptCount方法獲取失敗的task數(shù)final?int?pending?=?progress.getTotalTaskCount()?-?progress.getSucceededTaskCount()?-progress.getRunningTaskCount();final?int?killed?=?progress.getKilledTaskCount();

在0.5.0的tez中org.apache.tez.dag.api.client.Progress類沒(méi)有g(shù)etFailedTaskAttemptCount方法
在0.5.2的tez中才開(kāi)始增加這個(gè)方法,因此要想使用hive0.14.0的話,需要使用tez-0.5.2以上的版本

2.升級(jí)至hive0.14.0+tez-0.5.2之后,發(fā)現(xiàn)如下錯(cuò)誤:

15/01/13?14:09:21?INFO?client.TezClient:?The?url?to?track?the?Tez?Session:?http://xxxx:8042/proxy/application_1416818587155_0049/ Exception?in?thread?"main"?java.lang.RuntimeException:?org.apache.tez.dag.api.SessionNotRunning:?TezSession?has?already?shutdownat?org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:457)at?org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)at?org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)at?sun.reflect.NativeMethodAccessorImpl.invoke0(Native?Method)at?sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at?sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at?java.lang.reflect.Method.invoke(Method.java:597)at?org.apache.hadoop.util.RunJar.main(RunJar.java:212) Caused?by:?org.apache.tez.dag.api.SessionNotRunning:?TezSession?has?already?shutdownat?org.apache.tez.client.TezClient.waitTillReady(TezClient.java:599)at?org.apache.hadoop.hive.ql.exec.tez.TezSessionState.open(TezSessionState.java:212)at?org.apache.hadoop.hive.ql.exec.tez.TezSessionState.open(TezSessionState.java:122)at?org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:454)...?7?more

可以看到是由于在session初始化異常導(dǎo)致,異常是由TezSessionState.open方法拋出:

....try?{session.waitTillReady();}?catch(InterruptedException?ie)?{//ignore}

其中session為T(mén)ezClient的實(shí)例,在TezClient.waitTillReady方法中

public?synchronized?void?waitTillReady()?throws?IOException,?TezException,?InterruptedException?{if?(!isSession)?{//?nothing?to?wait?for?in?non-session?modereturn;}verifySessionStateForSubmission();while?(true)?{TezAppMasterStatus?status?=?getAppMasterStatus();?//這里getAppMasterStatus方法返回了TezAppMasterStatus.SHUTDOWNif?(status.equals(TezAppMasterStatus.SHUTDOWN))?{throw?new?SessionNotRunning("TezSession?has?already?shutdown");}if?(status.equals(TezAppMasterStatus.READY))?{return;}Thread.sleep(SLEEP_FOR_READY);} }

這里創(chuàng)建TezClient時(shí)設(shè)置了為sessionmode,并且getAppMasterStatus返回了TezAppMasterStatus.SHUTDOWN,導(dǎo)致在waitTillReady方法中拋出異常,即TezAppMaster沒(méi)有啟動(dòng)正常導(dǎo)致,查看nm的日志,發(fā)現(xiàn)由如下報(bào)錯(cuò):

2015-01-13?16:27:58,162?WARN?org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor:?Exception?from?container-launch?with?container?ID:?container_1416818587155_0060_01_000001?and?exit?code:?1 ExitCodeException?exitCode=1:at?org.apache.hadoop.util.Shell.runCommand(Shell.java:538)at?org.apache.hadoop.util.Shell.run(Shell.java:455)at?org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)at?org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:196)at?org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:299)at?org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81)at?java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)at?java.util.concurrent.FutureTask.run(FutureTask.java:138)at?java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)at?java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)at?java.lang.Thread.run(Thread.java:662)

是由于啟動(dòng)am的container異常報(bào)錯(cuò),查看對(duì)應(yīng)的container日志:

2015-01-13?17:34:59,731?FATAL?[main]?app.DAGAppMaster:?Error?starting?DAGAppMaster java.lang.VerifyError:?class?org.apache.hadoop.yarn.proto.YarnProtos$ApplicationIdProto?overrides?final?method?getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;at?java.lang.ClassLoader.defineClass1(Native?Method)at?java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)at?java.lang.ClassLoader.defineClass(ClassLoader.java:615)at?java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)at?java.net.URLClassLoader.defineClass(URLClassLoader.java:283)at?java.net.URLClassLoader.access$000(URLClassLoader.java:58)at?java.net.URLClassLoader$1.run(URLClassLoader.java:197)at?java.security.AccessController.doPrivileged(Native?Method)at?java.net.URLClassLoader.findClass(URLClassLoader.java:190)at?java.lang.ClassLoader.loadClass(ClassLoader.java:306)at?sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)at?java.lang.ClassLoader.loadClass(ClassLoader.java:247)at?java.lang.Class.getDeclaredConstructors0(Native?Method)at?java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)at?java.lang.Class.getConstructor0(Class.java:2699)at?java.lang.Class.getConstructor(Class.java:1657)at?org.apache.hadoop.yarn.factories.impl.pb.RecordFactoryPBImpl.newRecordInstance(RecordFactoryPBImpl.java:62)at?org.apache.hadoop.yarn.util.Records.newRecord(Records.java:36)at?org.apache.hadoop.yarn.api.records.ApplicationId.newInstance(ApplicationId.java:49)at?org.apache.hadoop.yarn.util.ConverterUtils.toApplicationAttemptId(ConverterUtils.java:137)at?org.apache.hadoop.yarn.util.ConverterUtils.toContainerId(ConverterUtils.java:177)at?org.apache.tez.dag.app.DAGAppMaster.main(DAGAppMaster.java:1794)

看樣子是protoc-buf兼容的問(wèn)題
cdh5.2.0默認(rèn)使用protobuf-java-2.5.0.jar,hive0.14.0默認(rèn)使用protobuf-java-2.5.0.jar,tez 0.5.2也使用pb2.5.0編譯,理論上應(yīng)該不會(huì)有pb兼容性問(wèn)題,懷疑是在tezam啟動(dòng)時(shí)加載了2.4.0a 的pb,需要查看啟動(dòng)命令,找到對(duì)應(yīng)的classpath:
通過(guò)更改org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor類,增加Thread.sleep來(lái)查看啟動(dòng)am的shell,重新編譯cdh5.2.0包(主要需要java7支持 range [1.7.0,1.7.1000}],編譯時(shí)跳過(guò)native: mvn package -DskipTests -Pdist -Dtar -e -X),
并替換./share/hadoop/yarn/hadoop-yarn-server-nodemanager-2.5.0-cdh5.2.0.jar 測(cè)試:
shell的調(diào)用如下:

default_container_executor.sh-->default_container_executor_session.sh-->launch_container.sh

而在launch_container.sh腳本:

export?HADOOP_COMMON_HOME="/home/vipshop/platform/hadoop-2.5.0-cdh5.2.0"??#先設(shè)置相關(guān)的變量 export?CLASSPATH="$PWD:$PWD/*:$HADOOP_CONF_DIR:"?#這里重設(shè)了CLASSPATH export?HADOOP_TOKEN_FILE_LOCATION="/home/vipshop/hard_disk/7/yarn/local/usercache/hdfs/appcache/application_1416818587155_0075/container_1416818587155_0075_01_000001/container_tokens" .... ln?-sf?"/home/vipshop/hard_disk/10/yarn/local/filecache/42/hadoop-yarn-api-2.5.0.jar"?"hadoop-yarn-api-2.5.0.jar"??#建立相關(guān)jar的軟連接到本地目錄 hadoop_shell_errorcode=$? if?[?$hadoop_shell_errorcode?-ne?0?] thenexit?$hadoop_shell_errorcode fi ..... exec?/bin/bash?-c?"$JAVA_HOME/bin/java??-Xmx819m?-server-Djava.net.preferIPv4Stack=true?-Dhadoop.metrics.log.level=WARN?-XX:+PrintGCDetails?-verbose:gc?-XX:+PrintGCTimeStamps?-XX:+UseNUMA-XX:+UseParallelGC?-Dlog4j.configuration=tez-container-log4j.properties-Dyarn.app.container.log.dir=/home/vipshop/hard_disk/9/yarn/logs/application_1416818587155_0075/container_1416818587155_0075_01_000001?-Dtez.root.logger=INFO,CLA?-Dsun.nio.ch.bugLevel=''?org.apache.tez.dag.app.DAGAppMaster?--session?1>/home/vipshop/hard_disk/9/yarn/logs/application_1416818587155_0075/container_1416818587155_0075_01_000001/stdout?2>/home/vipshop/hard_disk/9/yarn/logs/application_1416818587155_0075/container_1416818587155_0075_01_000001/stderr?"#最后運(yùn)行?java??org.apache.tez.dag.app.DAGAppMaster,即 org.apache.tez.dag.app.DAGAppMaster的main方法,啟動(dòng)DAGAppMaster

CLASSPATH為shell所在的目錄,比如這里

CLASSPATH='/home/vipshop/hard_disk/11/yarn/local/usercache/hdfs/appcache/ application_1416818587155_0079/container_1416818587155_0079_01_000001: /home/vipshop/hard_disk/11/yarn/local/usercache/hdfs/appcache/ application_1416818587155_0079/container_1416818587155_0079_01_000001/*: /home/vipshop/conf:'

在shell的當(dāng)前目錄下查找包含pb的包,發(fā)現(xiàn)有一個(gè)hive-solr中集成了pb,并且查看到其pb版本為2.4.0a:

for?i?in?`find?.?-name?"*.jar"`;?do?echo?$i?`jar?-tvf?$i|grep?GeneratedMessage|wc?-l`;?done|awk?'{if($2>0)?print}'???????????????????????? ./protobuf-java-2.5.0.jar?31??//2.5.0 ./hive-exec-0.14.0-dfffe4217f40bd764977b741ad970a562e07fb9×××f0180620bd13f68a2577b.jar?31?//2.5.0 ./hive-solr-0.0.1-SNAPSHOT-jar-with-dependencies.jar??//2.4.0a

這就導(dǎo)致在container啟動(dòng)時(shí),classloader加載到了2.4.0a的pb,最終導(dǎo)致container啟動(dòng)失敗。使用2.5.0的pb重新編譯這個(gè)jar包后,hive on tez就運(yùn)行正常了

轉(zhuǎn)載于:https://blog.51cto.com/caiguangguang/1604100

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的hive on tez踩坑记2-hive0.14 on tez的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。