2012-04-25 62 views
0

我已閱讀了Apache和Yahoo在DistributedCache上的教程。但我仍然對一件事感到困惑。假設我有一個我想要複製到所有數據節點的文件。因此,我在作業Driver中使用 DistributedCache.addCacheFile(new URI(hdfsPath),job)以使文件可用。然後,我在Mapper中調用DistributedCache.getLocalCacheFiles(job)Hadoop DistributedCache

現在,我想根據此文件的內容在數據節點上創建一個數組,以便每次map()運行時,都可以訪問數組的元素。我可以這樣做嗎?我很困惑,因爲如果我讀取緩存文件並在Mapper類中創建數組,它似乎會爲Mapper的每個新輸入創建數組,而不是每個Mapper創建一次。這部分實際上是如何工作的(即,我應該在何時/何時創建數組)?

+0

我想我可能已經找到了我自己的問題的答案。它看起來好像在實例化Mapper時自動調用configure()方法。因此,應該使用configure()來創建數組。這在map()方法之外,所以它只發生一次。我希望那是對的! – occasionalUser 2012-04-25 15:36:23

回答

2

這裏有幾個概念混合在一起。 Datanode與DistributedCache無直接關係。它是MapReduce層的概念。
想要在映射器之間重用緩存文件中的相同衍生物與MR範例的功能性質有些矛盾。映射器應該在邏輯上獨立。
你想要的是一種優化,如果預處理映射器的緩存文件相對昂貴,那麼它是有意義的
你可以在某種程度上通過將預處理數據保存在某個靜態變量中,懶惰評估它並設置hadoop在任務之間重用虛擬機。這不是「MR」精神解決方案,但應該工作。
更好的解決方案是將預緩存的文件預處理爲表單,其映射器的消耗將很便宜。
讓我們假設所有的想法都是一種優化 - 否則爲每個映射讀取和處理文件就好了。
可以說,如果爲每個映射器準備文件比映射處理本身便宜得多,或者比映射器運行開銷便宜得多 - 我們就沒事了。
通過形式我的意思是文件的格式,它可以非常有效地轉換爲我們需要的內存結構。例如 - 如果我們需要在數據中進行一些搜索 - 我們可以存儲已經排序的數據。這將節省我們每次排序,什麼,通常比從磁盤連續讀取更昂貴
如果你的情況是屬性在一些適度的數字(比如說數千),我可以假設他們的讀數和初始化並不重要比較到單個映射器

+0

我確實希望映射器是獨立的。我只希望他們每個人都擁有相同數據的副本(例如,輸入中的用戶ID作爲密鑰傳遞,並且我有一些用戶的屬性存儲在我希望訪問的文件中)。我不認爲每次都會將屬性作爲輸入的一部分傳遞,但我認爲讓它們在每個節點的單個文件中列出一次(對於所有用戶)可能會更好。 我不確定我是否理解「將緩存的文件預處理爲表單」的含義。你能在這裏解釋你的意思嗎? – occasionalUser 2012-04-25 16:36:18

+0

我已經給答案添加了一些解釋。 – 2012-04-25 16:54:50

+0

謝謝你的額外解釋! – occasionalUser 2012-04-25 17:10:13