1

在Scala/Hadoop系統中充分利用多核並行處理的更好方法是什麼?將工作分配給多個核心:Hadoop或Scala的並行集合?

假設我需要處理1億個文檔。文件不是很大,但處理它們是計算密集型的。如果我的Hadoop集羣有100臺機器,每臺機器有10個內核,我可以:

A)向每臺機器發送1000個文檔,讓Hadoop在10個內核中的每一個上啓動一個映射(或可用的最多)

B)發送1000個文檔,以每臺機器(仍在使用Hadoop),並使用Scala的並行集合,以充分利用多核的。 (我會將所有文檔放在並行集合中,然後在集合上調用map)。換句話說,使用Hadoop在集羣級別進行分發,並使用並行集合來管理每臺計算機內核的分配。

回答

1

答案取決於以下問題 - 您的Scala代碼是否能夠充分利用所有可用的內核。如果你在處理文檔的各個部分之間有很好的固有同步,或者沒有鎖爭用,那麼你可以使用parralelyze算法的其他方法 - 那麼「B」就是方法。如果是這樣 - 爲每個節點配置一個映射器並讓映射器使用核心以最佳方式
如果您從parralelization中獲得的收益並不理想,並且向處理添加更多線程(核心)不會以線性方式提高性能 - 那麼「A」可能是更好的方法。 「A」還取決於RAM的大小 - 每個節點需要10個映射器的足夠內存。
我可以懷疑理想的解決方案可能介於兩者之間。所以我的建議是開發mapper,它將線程的數量作爲參數,然後做一些測試,增加每個mapper的線程數量,減少每個node的mapper數量。

2

Hadoop將提供的不僅僅是並行化。它提供了一個分配工作的平臺,一個處理併發作業的調度程序,一個分佈式文件系統,執行分佈式減少的能力和容錯。這就是說,這是一個複雜的系統,有時可能很難合作。

如果您計劃讓多個用戶提交多個不同的作業,Hadoop就是要走的路(在兩個選項之外)。但是,如果您正在致力於通過相同功能處理文檔,則可以毫不費力地開發出一個具有Scala並行集合和演員的系統,以實現機器間通信。 Scala解決方案可以提供更多的控制權,系統可以實時響應,而且您不必處理大量與您的任務無關的Hadoop配置。

如果您需要在大量數據上運行不同的作業(大於適合單個節點的數據),請使用Hadoop。如果你更詳細地描述你的要求,我可以給你更多的信息。

更新:百萬是一個相當小的數字。您可能想要進行一些計算,並查看具有並行集合的單臺機器需要多長時間。這裏的優勢是開發時間最短!

+0

這是有用的信息,但我認爲我的問題是誤導。我現在編輯了我的問題。它不是Scala或Hadoop;它更像是Hadoop與Hadoop,用於在節點之間分配PLUS Scala並行集合,以便分發到每臺機器的內核。 – Adrian 2012-03-16 02:45:53

+3

你的任務是可並行化的,所以你不會在Hadoop之上使用scala並行集合。相反,您可以運行足夠多的Hadoop映射器來填充所有內核。通常在使用Hadoop時,您的任務將是單線程的。您已經將您的問題與Hadoop MapReduce進行了並行處理。 – schmmd 2012-03-16 03:32:11

+0

這很有道理。謝謝。 – Adrian 2012-03-16 04:19:30

1

Hadoop對於處理大量小文件並不是很好,但對於處理少量非常大的文件。有什麼辦法可以在處理它們之前合併文件,或者它們都完全不同? Hadoop負責分配和並行性,因此不需要將X文檔明確地發送到Y機器。而且我也不認爲你應該只將hadoop用作分配機制,這不是它的目的。你應該使用真正的地圖/縮小,或者爲你想要做的任何事情建立自己的系統,但不要試圖按照你的意願彎曲。