? ? 最近想看下hadoop job提交的源碼馒胆,結(jié)果在mac使用偽分模式提交job時(shí),導(dǎo)致job提交失敗凝果。主要遇到的問(wèn)題有兩個(gè):
1祝迂、通過(guò)訪問(wèn)jobUI(localhost:8088),查看錯(cuò)誤日志器净,可以看到一行錯(cuò)誤信息:
? /bin/bash: /bin/java: No such file or directory
原因:Hadoop默認(rèn)檢查/bin/java路徑下的java(Linux環(huán)境下)液兽,可是Mac的Java不是裝這里的,它的路徑是/usr/bin/java掌动。所以在這里可以建立一個(gè)軟連接四啰,通過(guò)sudo ln -s /usr/bin/java? /bin/java。這時(shí)候會(huì)出現(xiàn)另一個(gè)問(wèn)題粗恢, ln: /bin/java: Operation not permitted柑晒。也就是說(shuō)沒(méi)有權(quán)限,通過(guò)查找資料得知眷射,這是蘋(píng)果在OS X 10.11中引入的SIP特性匙赞,使得即使加了sudo(也就是具有root權(quán)限)也無(wú)法修改系統(tǒng)級(jí)的目錄,其中就包括了/usr/bin妖碉,所以我們可以關(guān)閉rootless特性涌庭。
方法:重啟按住 Command+R,進(jìn)入恢復(fù)模式欧宜,打開(kāi)Terminal坐榆,輸入csrutil disable,如果要回復(fù)默認(rèn)設(shè)置冗茸,也必須在恢復(fù)模式下席镀,輸入csrutil enable即可匹中。
另一種是將本要鏈接到/usr/bin下的改鏈接到/usr/local/bin
2.運(yùn)行時(shí),控制臺(tái)報(bào)錯(cuò):
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.qiang.mr.MyMaxTempMap not found
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)
at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:745)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.ClassNotFoundException: Class com.qiang.mr.MyMaxTempMap not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
... 8 more
我的理解:因?yàn)樽约褐翱催^(guò)hadoop提交job的運(yùn)行架構(gòu)和部分源碼豪诲,一個(gè)job在提交的過(guò)程中顶捷,ResourceManager會(huì)將任務(wù)加入隊(duì)列,會(huì)在NodeManager中形成container(容器)屎篱,每個(gè)job都會(huì)形成一個(gè)container,里面存放jar包等(job提交過(guò)程在這里簡(jiǎn)單提下)服赎,那么問(wèn)題來(lái)了,這個(gè)報(bào)錯(cuò)是因?yàn)檎也坏筋?lèi)交播,并且控制臺(tái)還輸出 04/08 16:09:15 INFO mapred.YARNRunner: Job jar is not present. Not adding any jar to the list of resources重虑,所以這里應(yīng)該以提交jar包的形式運(yùn)行,(在分布式和偽分布式模式下堪侯,jar包會(huì)分發(fā)到DataNode),而不是通過(guò)ide直接運(yùn)行荔仁,所以為了讓程序直接通過(guò)ide運(yùn)行伍宦,將mapred-site.xml的配置項(xiàng)mapreduce.framework.name 改為lcoalhost(本地模式,之前報(bào)錯(cuò)的時(shí)候我配置的是yarn)即可乏梁。也就是說(shuō),開(kāi)發(fā)工具,自動(dòng)的把class 添加到了class path里次洼,這樣就能順利執(zhí)行了。
注:我想復(fù)現(xiàn)一下第一個(gè)問(wèn)題遇骑,把/bin/java鏈接刪掉之后卖毁,發(fā)現(xiàn)問(wèn)題并沒(méi)有復(fù)現(xiàn),但是落萎,在出現(xiàn)這個(gè)問(wèn)題的時(shí)候亥啦,通過(guò)增加鏈接,這個(gè)問(wèn)題是確實(shí)可以解決的练链。在出現(xiàn)錯(cuò)誤的時(shí)候翔脱,可以結(jié)合控制臺(tái)和job的log進(jìn)行定位問(wèn)題。