2013-02-21 58 views
1

分片輸出(標題應該是分片,以反映Hadoops 碎片其在多個文件輸出)閱讀從Hadoop的工作從DistributedCache

我鏈接多個Hadoop作業在一起。其中一個早期的作業會產生比其他作品小几個數量級的輸出,因此我想將它放到DistributedCache中。這是一個很難的部分。這是我寫的代碼這樣做:

FileSystem fs = FileSystem.get(conf); 
Path pathPattern = new Path(distCache, "part-r-[0-9]*"); 
FileStatus [] list = fs.globStatus(pathPattern); 
for (FileStatus status : list) { 
    DistributedCache.addCacheFile(status.getPath().toUri(), conf); 
} 

這適用於我的本地機器和我設置的虛擬羣集。 但是,與this question不同,它在AWS上失敗,理由是DistributedCache.getCacheFiles()的返回值是空列表。

本質上,我需要以編程方式從一個MR作業讀取分片輸出並將其放入DistributedCache。我無法指定硬文件名,因爲每次運行程序時減速器的數量都可能會發生變化。我並不完全瞭解S3和HDFS如何協同工作,因此我們很難與文件系統進行交互來讀取分片輸出。我如何以適用於AWS的方式來實現這一點?

僅供參考,我使用的是Hadoop 1.0.x:1.0.4(四個Ubuntu 12.10虛擬機)和1.0.3(AWS)的組合。

+0

有點;它不同於我以編程方式寫入和從緩存中讀取數據,而我無法確定這兩者之間的問題在哪裏。當只有「part-r-00000」擔心時,手動添加文件就可以工作得很好;隨着*分佈式模式下的任意分片,我正在設計一個可以在分佈式和獨立模式下工作的解決方案。 – Magsol 2013-02-22 20:13:51

回答

1

原來這是一個簡單的解決得到的東西在AWS上工作:那麼

FileSystem fs = distCache.getFileSystem(conf); 

AWS可以看到目錄下的碎片,它執行就好了。我仍然不知道爲什麼在我的問題中,前面的代碼在標準集羣上運行得很好時,AWS才能工作,但是您擁有它。