今日我在eclipse上運行Map/Reduce框架進行數(shù)據(jù)分析的時候遇到了一個很奇怪的錯誤:
一開始我發(fā)現(xiàn)運行程序之后也沒在控制臺報錯,也生成了目標目錄豫尽,但一直出不來統(tǒng)計好的數(shù)據(jù)文件篙梢。
我先通過位置標記輸出來判斷各個類的加載是否正常,
發(fā)現(xiàn)Map是可以正常加載執(zhí)行的美旧,但是Reduce一直無法加載執(zhí)行渤滞。
然后我通過設(shè)置贬墩,讓其在運行時顯示日志信息,再運行妄呕。
文末會分享設(shè)置顯示日志信息的方法陶舞。
這一次便發(fā)現(xiàn)了如下的報錯:
日志中的報錯信息:
java.lang.Exception: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in localfetcher#1at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:529)Caused by: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in localfetcher#1at org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:134)at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:376)at org.apache.hadoop.mapred.LocalJobRunner$Job$ReduceTaskRunnable.run(LocalJobRunner.java:319)at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)at java.util.concurrent.FutureTask.run(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)Caused by:(1)]java.io.FileNotFoundException: E:/tmp/hadoop-Alan%20Yang/mapred/local/localRunner/Alan%20Yang/jobcache/job_local214639494_0001/attempt_local214639494_0001_m_000003_0/output/file.out.indexat org.apache.hadoop.fs.RawLocalFileSystem.open(RawLocalFileSystem.java:200)at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:767)at (2)]org.apache.hadoop.io.SecureIOUtils.openFSDataInputStream(SecureIOUtils.java:156)at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:70)at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:62)at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:57)at org.apache.hadoop.mapreduce.task.reduce.LocalFetcher.copyMapOutput(LocalFetcher.java:124)at org.apache.hadoop.mapreduce.task.reduce.LocalFetcher.doCopy(LocalFetcher.java:102)at org.apache.hadoop.mapreduce.task.reduce.LocalFetcher.run(LocalFetcher.java:85)2017-07-12 16:19:02,616 INFO [org.apache.hadoop.mapreduce.Job] - Job job_local214639494_0001 failed with state FAILED due to: NA2017-07-12 16:19:02,663 INFO [org.apache.hadoop.mapreduce.Job] - Counters: 22File System CountersFILE: Number of bytes read=62223FILE: Number of bytes written=176635984FILE: Number of read operations=0FILE: Number of large read operations=0FILE: Number of write operations=0HDFS: Number of bytes read=898750946HDFS: Number of bytes written=0HDFS: Number of read operations=140HDFS: Number of large read operations=0HDFS: Number of write operations=10Map-Reduce FrameworkMap input records=2629660Map output records=2626091Map output bytes=26260910Map output materialized bytes=31513152Input split bytes=1210Combine input records=0Spilled Records=2626091Failed Shuffles=0Merged Map outputs=0GC time elapsed (ms)=496Total committed heap usage (bytes)=7754743808File Input Format Counters Bytes Read=163038920
按照通常的排錯思路,后面的錯誤往往是前面的錯誤導(dǎo)致產(chǎn)生的绪励,所以我先入為主的直接去搜索 error in shuffle in localfetcher的解決辦法肿孵,發(fā)現(xiàn)幾乎都在說是內(nèi)存的問題。百般嘗試始終是毫無成效疏魏。
后來當我往下看的時候發(fā)現(xiàn)其實日志給出了大概的錯誤原因停做,是路徑的問題。這一下子就找到了正確的方向大莫。通過查找資料蛉腌,發(fā)現(xiàn)有的朋友通過修改默認的路徑即可解決,我嘗試了一下只厘,結(jié)果只是換個路徑報錯而已烙丛。這就耐人尋味了,我再自己看了看這條報錯信息懈凹,里面用到了我的Windows的用戶名蜀变,但是中間的空格變成了%20,在路徑中出現(xiàn)%這意味著什么介评?配過環(huán)境變量的人都知道库北。我一下子恍然大悟。很有可能是Windows用戶名的問題们陆。所以我去修改了Windows本機的用戶名寒瓦,把空格去掉。一下子就解決了F撼稹T友!
eclipse控制臺不顯示MapReduce程序日志的解決方法:
使用Hadoop2.6.0椅文,在eclipse下面調(diào)試mapreduce程序的時候喂很,控制臺不打印程序運行時的日志,而是顯示如下信息:
log4j:WARN No appenders could be found for logger (org.apache.[Hadoop]
log4j:WARN Please initialize the log4j system properly.
log4j:WARN [hadoop] See noconfig for more info.
說明沒有配置log4j.properties文件皆刺。這雖然不影響程序的正常運行少辣,但是看不到日志難免不爽。解決方法:把Hadoop2.6.0的安裝目錄下面的/etc/hadoop/目錄下面的log4j.properties文件拷貝放到MapReduce工程的src目錄下面羡蛾。