2011-04-22 25 views
0

我有一個Java應用程序,我將其作爲概念證明移植到雲體系結構中。我想通過在單獨的虛擬機上的文件塊上運行相同的處理程序來處理非常大的文本文件。許多虛擬機讀取併發文本文件

工作節點= N

頭節點上運行主機和一個工人,n-1個工作節點

我心裏有兩個想法:

  1. 主機讀取文件中的行,由-line,將第一行發送到第一個工作節點,第二行到第二個工作節點等,每n行重複一次。

  2. 主讀取文件中的行數。然後工作者節點指示從文件中同時讀取no_of_lines/n。

我正在考慮使用基於RMI或基於套接字的方法來傳輸數據。誰能告訴我哪種上述方法最有效率?如果這個問題不能在沒有指定我將使用哪個java結構的情況下得到解答,那麼我會很感激這些建議。

另外,如果每個節點都知道它應該讀取哪些行,那麼鎖定會是併發文件訪問的問題嗎?

感謝您的任何建議

伊恩

回答

2

先來的第二個問題,從來就沒有在許多程序讀取一個文件IFF沒有任何程序問題寫入文件:每個程序都有自己的文件 - 位置指針。即使某些程序正在寫入文件,如果該程序始終寫入文件的末尾,在任何一個合理的系統中,始終都是這樣,那麼可能沒有任何問題。

至於第一個問題,IFF文件中的所有行都是恆定長度的,那麼問題總是效率問題之一:讀取多行比讀取一行更有效。

如果我在做這個項目,主人會要求工作人員閱讀(n_lines_in_file/n_workers)行。在我看來,主人的讀物中沒有多少意義,並將它們傳遞給工人。不過,假設每行都採用與其他工作相同數量的工作進程。

如果那不是真的,或者如果有其他變量你沒有告訴,我的策略無疑會改變。

+0

感謝皮特,輸入將是一個數百兆字節的文本文件,可能爲兆兆字節。我將從一臺機器上的單個文件開始,但我還需要探索可首先以分佈式方式創建數據集的選項。我現在正在查看SRB,我可能會編寫一個程序,它可以從單個文件輸入,也可以從分佈式文件存儲中讀取。有什麼想法嗎?歡呼聲 PS。相同的查詢將在每行上運行,並且長度不完全相同,但包含相同的字段 – bashcrufter 2011-04-23 12:22:49

1

當你分解一個程序時,你應該確保你沒有創建比你想要保存更多的開銷。例如,與進行RMI調用相比,閱讀幾行文本相對便宜。將數據複製到許多主機可能比您打算執行的處理更昂貴。

處理需要多長時間?這將指導您確定每項工​​作的有效程度。您可能會發現線程的最佳數量是一個。 ;)

+0

您好Peter,因爲文件大小爲100s MB - > TB。您認爲使用RMI調用會在使用它們向VM發送大量數據時產生大量開銷嗎?當數據太大時,瓶頸似乎是I/O,因此我在考慮SRB/iRODS。乾杯 – bashcrufter 2011-04-23 12:26:50

+0

你是正確的,IO可能是一個問題。這意味着您需要一種儘可能高效地分發數據並儘可能少複製的解決方案。例如你可以有一個RMI調用來發送文件名和文件的區域來讀取,而不是實際的數據。 (假設所有serverc都訪問數據)RMI調用並不是免費的,但如果你保持調用的數量低,我懷疑它們不會有太大的影響。 – 2011-04-23 16:05:51