2013-08-21 10 views
0

(不建議的Hadoop或地圖縮短解決方案,甚至他們的聲音在邏輯上是相同的)的Linux分發大文件和收集結果

我有一個很大的文件 - 70GB的原始HTML文件,我需要做的解析,以獲取我需要的信息。

cat input_file | python parse.py > output_file 

而在我的Python腳本,它從標準輸入讀取每個HTML(每行每HTML),並將結果回寫到標準:

我已經成功地使用standardI/O之前,10GB文件衣食住行輸出。

from bs4 import BeautifulSoup 
import sys 
for line in sys.stdin: 
    print .... 

的代碼非常簡單,但現在,我處理的一個大的文件,該文件是一個節點上異常緩慢。我有一個大約20個節點的集羣。我想知道如何輕鬆地分發這項工作。

我迄今所做的:

split -l 5000 input_file.all input_file_ # I have 60K lines in total in that 70G file 

現在的大文件已經被分爲幾個小檔案:

input_file_aa 
input_file_ab 
input_file_ac 
... 

然後,我與他們每個人的工作沒有問題:

cat input_file_aa | python parser.py > output_file_aa 

我該怎麼做可能是scp輸入文件到每個節點,然後做解析,然後scp結果回來,但有10多個節點!我手動操作非常繁瑣。

我想知道如何輕鬆地將這些文件分發給其他節點,並執行解析並將結果移回?

我對基本的SHELL,JAVA,Python解決方案開放。如果您需要更多解釋,請提前致謝並通知我。

請注意,我確實有一個名爲/ bigShare /的文件夾,可以在每個節點上評估,並且內容是同步的並保持不變。我不知道架構師如何實現(NFS ..?我不知道如何檢查),但我可以將我的input_file和python腳本放在那裏,剩下的就是如何輕鬆登錄到這些節點並執行命令。 順便說一句,我在紅帽。

+4

你爲什麼試圖建立你自己的分佈式計算系統?您不希望我們建議的選項有什麼問題?不知道爲什麼這些不適合,我們將錯過重要信息。 – user2357112

+0

將它放在NFS驅動器上? – jman

+0

@ user2357112集羣是一個企業集羣,我沒有root來安裝一個新的結構。對於,我不太清楚NFS是什麼,但我們確實有一個文件夾/共享,它存在於每個節點上,並且具有同步的內容。現在我看到我可以輕鬆分發input_file,但我怎麼能輕鬆讓所有這些節點運行該命令? –

回答

2

通過遠程管道遠程執行命令到stdout。然後使本地命令管道到本地文件。

實施例:

ssh [email protected] "cat input_file_node1 | python parser.py" >output_file_node1 

如果文件沒有被複制到不同的節點,則:

ssh [email protected] "python parser.py" <input_file_node1 >output_file_node1 

這假定yourUserName已配置了基於密鑰的認證。否則,您需要手動輸入您的密碼(20次!:-()。爲了避免這種情況,您可以使用expect,但我強烈建議設置基於密鑰的身份驗證,您也可以使用expect

+0

我不知道顏色看起來是否與我們相同,但是..紅色命令(雙引號)實際上是要在其他節點上運行的命令。黑色的命令/文件實際上是本地機器上的文件..對嗎? –

+0

@ B.Mr.W。這有點巧合,但是:黑色部分在本地發生,而紅色部分在遠程發生。 –

+0

你的回答很鼓舞人心,我還有最後一個問題。我沒有任何問題運行每個命令,但在命令後,終端掛在那裏。你建議我使用20 nohup? –

2

假設您想要在自己的主機上處理每個文件的一部分:首先將python腳本複製到遠程主機。然後遍歷所有的遠程主機:

for x in aa ab ac ...; do 
    ssh [email protected]$x python yourscript.py <input_file_$x >output_file_$x & 
done; 

如果處理節點沒有,很容易產生,你可以在你的.ssh/config爲其創建別名的名稱,例如:

Host remote-aa 
    Hostname alpha.int.youcompany 

Host remote-ab 
    Hostname beta.int.yourcompany 

Host remote-ac 
    Hostname gamma.int.yourcompany 

這種特殊用例可以通過編輯/ etc/hosts來解決。

+0

我去了〜/ .ssh /並且沒有名爲config的文件,但是有一個名爲known_hosts的文件,其中包含名稱,ip,ssh-rsa ....我不知道這是否是您提及的文件。 –

+0

「config」文件在創建之前不存在。 – Joni

+0

另一個問題是我對內存的擔心,所以你在起始節點上做了20個ssh,比如node_01,從標準輸入輸出文件讀取輸入文件到標準輸出。所有那些20 stdI/O都會搞亂內存?或者你可以指點我一些資源,我可以更好地瞭解stdI/O或Shell ...謝謝 –