2013-04-23 90 views
0

有幾個相關的問題,但我花了整整一天的時間來試圖找出這個問題,答案並沒有真正在任何地方,所以我正在爲後代進行記錄。Hadoop Map減少分佈式緩存類路徑問題

我有一個Hadoop安裝(CDH 3u6 - Hadoop 0.20.2),我想在其中發送一個具有多個Jar依賴關係的map reduce作業。像大多數地方推薦的那樣,我想使用分佈式緩存來將依賴關係發送到數據節點。

Path someHdfsPlace = new Path("my/mr/libs"); 
FileStatus[] jarFiles = hdfs.listStatus(classpathFilesDir); 
for (FileStatus fs : jarFiles) { 
     DistributedCache.addFileToClassPath(fs.getPath(), job.getConfiguration()); 
} 

我在不同的Hadoop集羣上看到了這個工作,現在突然間沒有了。該文件存在於hdfs中,似乎對文件及其上的目錄具有正確的權限,但是一旦嘗試從lib中加載依賴關係,任何MR代碼都會失敗,出現ClassNotFound錯誤(因此不是腐敗問題,只是這些東西沒有出現在課程路徑中)

一篇文章建議您必須設置$HADOOP_CLASSPATH變量 - 這在某些情況下可能會有所幫助,但是我不清楚您將設置爲什麼,在我以前的工作例子中,我不必那樣做,所以看起來不太可能。

完全神祕!

回答

0

對我來說,至少,答案是這樣的錯誤報告:

https://issues.apache.org/jira/browse/MAPREDUCE-1581

的路徑可能跨越是未來作爲一個完全合格的路徑:hdfs://host:2456/my/mr/libs/myJar.jar,在某些環境下:是路徑分隔符字符將導致一組冗餘文件hdfs,//host2456/my/mr/libs/myJar.jar,其中沒有一個會導致將正確的文件添加到類路徑中。

張貼在錯誤報告的第2解決方案爲我 - 資格的路徑,像這樣:

Path someHdfsPlace = new Path("my/mr/libs"); 
FileStatus[] jarFiles = hdfs.listStatus(classpathFilesDir); 
for (FileStatus fs : jarFiles) { 
     Path disqualified = new Path(fs.getPath().toUri().getPath()); 
     DistributedCache.addFileToClassPath(disqualified, job.getConfiguration()); 
}