2013-06-25 27 views
2

我知道,在映射器和減速機之間的中間步驟,Hadoop的將整理和的道路上減速分區數據。已經可以分區輸入數據改善hadoop處理嗎?

因爲我已經有分區數據在我的輸入處理的映射,是有辦法來利用它,並可能加快中間處理所以沒有更多的排序或分組,通過將發生?

添加一些細節:

正如我存儲在S3上的數據,讓我們說我只有在我的桶的兩個文件。第一個文件將存儲下半部分用戶ID的記錄,另一個文件將存儲用戶ID的上半部分的值。每個文件中的數據不一定需要排序,但可以保證與用戶有關的所有數據都位於同一個文件中。

如:

\mybucket\file1 
\mybucket\file2 

File1 content: 
User1,ValueX 
User3,ValueY 
User1,ValueZ 
User1,ValueAZ 

File2 content: 
User9,ValueD 
User7,ValueB 
User7,ValueD 
User8,ValueB 

從我讀,我可以用一個數據流作業和兩個映射器,並且每個映射器將在這兩個文件中的一個吸,但整個文件。這是真的?

接下來, 假設映射器只輸出一次唯一的密鑰,相關的值就是該密鑰的出現次數。 (我認識到它更多的是減速器的責任,但僅僅作爲我們的例子)

是否可以禁用Mapper中那些輸出鍵的排序和分區,並讓它們自由飛行至減速器?

或者給出另一個例子: 想象一下,對於每個唯一鍵,我的所有輸入數據都只包含一行,並且我不需要在減速器的最終輸出中對數據進行排序。我只想爲每個密鑰哈希值。我可以在減速器之前禁用排序和分區步驟嗎?

+0

難道你就灑下更多的光線你的意思是「分區輸入到映射器」,也許是輸入數據的樣本呢? – Chaos

回答

0

雖然你上面顯示的文件會得到2個映射器,它不能總是保證。映射器的數量取決於從輸入數據創建的InputSplits的數量。如果你的文件很大,你可能會有多個映射器。

分區僅僅是一種方式告訴哪個鍵/值變爲其減速。如果禁用它,那麼你要麼需要一些其他的方式做到這一點,否則你會最終與性能下降,隨着輸入減速將是不平坦的。一個特定的reducer可能會得到所有的輸入,或者一個特定的reducer可能會得到零輸入。在這裏我看不到任何性能增益。當然,如果你認爲你的定製分區器能更好地適應這種情況,你肯定可以做到這一點。但跳過分區對我來說聽起來不合邏輯。默認分區行爲取決於hash本身。映射器發出其輸出密鑰後進行散列以找出哪組鍵/值對到哪個還原器。

如果您的數據已經排序並且您想要跳過MR作業中的排序階段,您可能會發現該JIRA提供的補丁提供了有用的響應。問題還沒有結束,但它肯定會幫助你入門。

HTH

+0

感謝您的JIRA鏈接。所以,你會說,有上保持我的數據通過用戶ID在我的輸入文件進行分組,而不是具有一定跨組的多個文件沒有真正的優勢在哪裏?我可能會從數據對某個工作人員的親和力加速的觀點出發,我試圖像這樣配置MR:我想要一個映射器來處理整個文件,並且我想讓Reducer變得非常簡單而公正彙總結果。 –

+0

如果您打算在InputFormat中通過1個映射器將「isSplittable」設置爲「true」來處理單個文件。這將確保您的文件不會被拆分,從而整個地映射到一個映射器。將輸入提供給MR作業時,數據如何排列在文件中並不重要。在mapper級別我看不到任何優勢。但是,在洗牌,分類和合並階段你可以獲得一些加速。 – Tariq

相關問題