2013-04-25 16 views
0

我有一個問題,需要我在迭代過程中過濾大量數據,數十TB。由於尺寸的原因,我想在2個連續的地圖階段進行計算,以便數據不需要通過網絡重新傳輸。Hadoop:在同步數據或ChainMap上運行兩個M/R作業,同步障礙

所以在算法的步驟是:1)分析所有數據,並在相同的數據決定,2)重新運行,並從1

以此爲基礎進行決策的過濾過程中,我推測有兩種方式解決這個問題,但每個似乎都有很大的問題。

1)解決方案,ChainMapper。問題:第一個映射器需要在第二個映射器完成之前完成。

2)解決方案,兩份工作。問題:由於作業之間的數據被刪除,數據在網絡中被重新傳輸。

我確定有些東西我錯過了,但我真的可以使用一些幫助!

感謝

+0

如果您必須擁有所有數據才能做出定義第二步的決定,那麼爲什麼第一個階段必須首先完成?似乎需要。否則這不是重新連線,這是你的問題的關鍵。 – 2013-04-25 23:25:31

+0

因爲決定是基於查看所有關鍵/值。所以直到我看到所有的關鍵/值對,我都不能說這個決定會是什麼。所以我在想Map - >根據mappers - > Map2做出決定。 – greedybuddha 2013-04-25 23:29:43

+0

對不起,我誤解了你的回覆。是的,我想第一張地圖要先完成。我只是不知道如何做到這一點,而不需要兩次重新發送網絡上的所有數據。 – greedybuddha 2013-04-25 23:33:49

回答

1

鑑於你澄清:你不能使用ChainMapper,但正是因爲不通過應用映射器1到所有按鍵,等待操作,然後將映射2.適用鏈條的地圖到每個輸入鍵。有些人會在其他人甚至開始之前完成階段1和階段2。但你說得對,它不會導致更多的數據通過網絡;這裏甚至沒有寫入磁盤!

由於您需要第一階段才能完成,您需要先完成Map階段,然後再執行其他任何階段2.在Mapper階段2中執行Reducer階段2。這是最簡單的。

奇怪的是,有兩個Map/Reduces可能會更快,但沒有ReducerReducer可以是無操作的,Reducer.class。致電setNumReduceTasks(0)。這樣避免了洗牌階段。它不會將數據複製到reducer,而只是轉儲到HDFS。

一般而言,您的下一個映射器將在HDFS數據之上產生。那裏沒有額外的轉移。

我不認爲你會在這裏避免一些數據傳輸來重新組織和重新存儲數據,但我認爲這不太可能主宰你的計算。

+0

所以這聽起來像是要走的路,但我只是跑一個測試,我不知道這是工作不將數據傳輸的兩倍。所以我做的是使用Teragen創建一個1TB的測試集。然後,我創建了一個程序,我減速的數量設置爲0。在這裏,我也說了第一個映射作業發送任何東西,也job.waitUntilCompletion(),然後我做了第二份工作權之後與發出任何其他製圖。這兩次地圖時間大約需要7分鐘才能完成。做同樣的事情,但在mappers之間只使用一個Chainmapper只需要7分鐘。 – greedybuddha 2013-04-26 20:49:48

+0

也許吧,但我不認爲ChainMapper是給你的要求的選項。你需要階段1在階段2之前完成,而這不是它所做的。 7分鐘是純粹的開銷。你可以調整一下。您也可以嘗試使用Mapper + Reducer。 – 2013-04-26 21:04:28

+0

的ChainMapper絕對不是一個選擇,我只是用它作爲比較。我會嘗試減速器,但理想情況下,我不需要通過隨機/排序計算。理想情況下,它將使用mapper和reducer的相同節點來減少網絡流量。所以,如果你知道如何做這兩件事情讓我知道。但是,我認爲你的答案給出了2種方式去了解這一點,可惜這不是真的非常適合我,但我認爲這些都是Hadoop的限制,而不是你的答案。 – greedybuddha 2013-04-26 21:16:12