師傅要我看hadoop,點名要用最新版本,結果遇到了相當多的問題,慢慢逐個解決之~
在linux下跑偽分布模式,老是出現NullPointerException
java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$GetMapEventsThread.getMapCompletionEvents(ReduceTask.java:2747)
at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$GetMapEventsThread.run(ReduceTask.java:2670)
查了下,關於這個的有文章
https://issues.apache.org/jira/browse/HADOOP-4744
https://issues.apache.org/jira/browse/MAPREDUCE-969
後來網上就是說的hosts和ip沒對上什麼的
想了半天后用了個簡單辦法解決
命令bin/hadoop namenode
啟動的時候就會給出你的host和ip的資訊,直接把設定檔裡面的localhost改成那裡面的ip就行了
叢集模式還沒嘗試,因為windows下出現的是其它問題……
windows下使用Cygwin跑:
跑wordcount和pi的例子的時候,都會出現FileNotFoundException
java.io.FileNotFoundException: File C:/tmp/hadoop-SYSTEM/mapred/local/taskTracker/jobcache/job_201005040912_0002/attempt_201005040912_0002_m_000006_0/work/tmp does not exist.
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:420)
網上結論
有個網址說明了問題是:
${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/work/tmp: task的臨時目錄。(使用者可以設定屬性mapred.child.tmp 來為map和reduce task設定臨時目錄。預設值是./tmp。如果這個值不是絕對路徑, 它會把task的工作路徑加到該路徑前面作為task的臨時檔案路徑。如果這個值是絕對路徑則直接使用這個值。 如果指定的目錄不存在,會自動建立該目錄。之後,按照選項 -Djava.io.tmpdir=’臨時檔案的絕對路徑’執行java子任務。 pipes和streaming的臨時檔案路徑是通過環境變數TMPDIR=’the absolute path of the tmp dir’設定的)。 如果mapred.child.tmp有./tmp值,這個目錄會被建立。
但是在Cygwin下必須要設定路徑
其實,最關鍵的是,要自己去建立那個檔案夾,否則還是會有問題,貌似說的是必需得絕對路徑(否則也沒法建立檔案夾呀),我弄絕對路徑並建好檔案夾後問題解決
題外話,關於namenode的format。再次format的時候會出現是否reformat的提示,這時候,大小寫很重要,小寫y是不行的,得大寫,但是好像就算大寫後啟動hadoop也會出現問題,在tasktracker的日誌裡會出現異常記錄,就是id不匹配,最簡單的辦法就是刪除掉檔案夾再重新format..
未解決的問題:
在跑pi估算的樣本的時候出現的IllegalArgumentException:
java.lang.IllegalArgumentException: n must be positive
at java.util.Random.nextInt(Random.java:250)
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.confChanged(LocalDirAllocator.java:243)
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:289)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124)
at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:107)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1221)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1129)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:549)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:623)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
at org.apache.hadoop.mapred.Child.main(Child.java:159)
這個地址問題產生原因描述得很詳細:https://issues.apache.org/jira/browse/HADOOP-6766
就不在這裡再寫了。有誰知道解決辦法一定告訴我一聲,謝謝~
在跑wordcount的時候出現的ClassCastException
2010-08-01 16:35:38,823 INFO org.apache.hadoop.mapred.TaskInProgress: Error from attempt_201008011634_0001_m_000001_0: java.lang.ClassCastException: org.apache.hadoop.mapreduce.lib.input.FileSplit cannot be cast to org.apache.hadoop.mapred.InputSplit
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:323)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
at org.apache.hadoop.mapred.Child.main(Child.java:170)
問題:
https://issues.apache.org/jira/browse/HADOOP-5576