2013-05-06 46 views
0

我正在使用DistributedCache。但是執行代碼後,緩存中沒有文件。 我已經提到了其他類似的問題,但答案並沒有解決我的問題。未存儲在分佈式緩存中的文件

請找到下面的代碼:

Configuration conf = new Configuration(); 
    Job job1 = new Job(conf, "distributed cache"); 
    Configuration conf1 = job1.getConfiguration(); 
    DistributedCache.addCacheFile(new Path("File").toUri(), conf1); 
    System.out.println("distributed cache file "+DistributedCache.getLocalCacheFiles(conf1)); 

這給了空..裏面映射給時

同樣的事情也給了空,因此。請讓我知道你的建議。

感謝

+0

HDFS文件是否存在?此外,getLocalCacheFiles的最終調用在您的驅動程序代碼中不起作用(但對於您的映射器 - 我假設您僅以此行爲例)。在作業追蹤器的Web UI中找到你的工作job.xml,並回傳'mapred.cache.files'的值 – 2013-05-06 10:28:24

+0

感謝getLocalCacheFiles在驅動程序中不起作用的信息,我只是試圖測試。但是在map類中,它也給出了空值。現在我只是發現它可以很好地使用DistributedCache.getCacheFiles(conf)。 這是否意味着我可以使用getCacheFiles(conf)而不是getLocalCacheFiles(conf)? 你能告訴我兩者之間的區別嗎? – 2013-05-07 09:48:33

+0

你可能想嘗試-files選項,這是非常簡單的。見我的答案在這裏:http://stackoverflow.com/questions/16251788/distributed-caching-in-hadoop-file-not-found-exception/16271657#16271657 – 2013-05-06 10:50:12

回答

2

試getCacheFiles()代替getLocalCacheFiles()

+0

你有我的+1,但你能解釋兩者之間的區別嗎? – Marko 2015-05-12 10:43:04

+0

這並不能解決問題。分佈式緩存的要點是創建本地副本。 getCacheFiles()返回原始文件的hdfs路徑。 Downvoted – frugalcoder 2017-05-08 08:51:23

1

我相信這是(至少部分地)由於什麼克里斯·懷特寫道here:您創建工作對象後

,需要拉回 配置對象作業創建它的副本,並在創建作業後在conf2中配置值 將對作業 iteself沒有影響。試試這個:

job = new Job(new Configuration()); 
Configuration conf2 = job.getConfiguration(); 
job.setJobName("Join with Cache"); 
DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2); 

我想,如果它仍不能正常工作,是在某個地方的另一個問題,但這並不意味着克里斯·懷特的觀點是不正確的。

+0

是的..我已經經歷了這些答案。我不是說答案不正確。即使嘗試了這些東西,我仍然面臨着這個問題。因此,請求你幫助在那裏有任何其他意見關於DistributedCache錯過了 – 2013-05-06 09:20:01

0

分發時,不要忘記本地鏈路名稱,最好使用相對路徑:

URI是形式hdfs://host:port/absolute-path#local-link-name

的讀取時:

  • 如果你不使用分佈式緩存的可能性,你應該使用HDFS的FileSystem來訪問hdfs://host:port/absolute-path
  • 如果使用分佈式緩存,那麼你必須使用標準的Java文件工具訪問local-link-name
0

緩存文件需要在Hadoop的文件系統。你可以這樣做: 無效copyFileToHDFS(JobConf jobConf,從字符串,字符串){

try { 
     FileSystem aFS = FileSystem.get(jobConf); 
     aFS.copyFromLocalFile(false, true, new Path(
       from), new Path(to)); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

一旦文件被複制,你可以將它們添加到緩存中,像這樣:

void fillCache(JobConf jobConf){ 
     Job job; 
     copyFileToHDFS(jobConf, fromLocation, toLocation); 
     job = Job.getInstance(jobConf); 
     job.addCacheFile(new URI(toLocation)); 
     JobConf newJobConf = new JobConf(job.getConfiguration()); 
    }