2

我想知道是否有可用的,以使類似的Apache Hadoop分佈式並行計算任何Perl模塊。Perl的分佈式並行計算

實施例, Perl腳本在許多機器平行時提交給客戶端節點來執行。

+0

如何電網::機http://search.cpan.org/~casiano/GRID-Machine/。我並不熟悉這個領域,但它看起來像是一種可能性。 – 2013-02-15 12:12:48

+0

沿着相同的路線...因爲你提到hadoop,也許你對MapReduce感興趣:http://search.cpan.org/~drrho/Parallel-MapReduce-0.09/lib/Parallel/MapReduce.pm – 2013-02-16 00:43:56

回答

1

你可能會考慮像ZeroMQ消息隊列這樣簡單的事情。我相信一個CPAN search可以幫助一些其他的建議。

最近出現了許多核心引擎MCE模塊,您可能需要調查,我不知道肯定它可以讓你並行關閉主機做的一些議論,但現在看來似乎不會鑑於其明確的目的,邁出一大步。

+0

這是從拼湊系統的角度思考一個很好的建議。 ZeroMQ可用作各種網絡拓撲中的膠粘連接組件,並具有連接運行各種語言編寫代碼的機器的優點。將其視爲一種高效的,編程友好的消息協議,並且支持多種語言的庫。 – ekillaby 2013-06-10 17:15:57

3

我是多核心引擎的Perl的作者。

在接下來的幾個週末,我會帶MCEGearman::XS旋轉。 MCE擅長最大化給定節點上的可用內核。 Gearman善於分配工作,幷包含許多功能,如負載平衡。將兩者結合起來就是我想要在許多節點上水平擴展MCE的原因。 :)直到現在,我還沒有與任何人分享這個消息。

爲什麼這兩個模塊一個不錯的選擇(愚見):

  1. 對於分佈,需要某種形式的分塊引擎。 MCE是一個組塊引擎 - 因此分解輸入對於MCE是很自然的。從本質上講MCE可以在兩側,作業提交主機以及對可用內核最大化工作節點上使用。

  2. 對於工作節點,MCE處理輸入數據時遵循銀行排隊模型。這有助於保證所有CPU從作業開始到最後都保持忙碌狀態。隨着工人閒下來,剩下的「工作」正在處理他們最後一塊。

一個人的想象力是這裏的限制 - 這兩個模塊共同工作的可能性很大。在編寫MCE時,我首先關注節點端。工作分配是明顯的下一步,我做了一個搜索,並遇到了Gearman :: XS。的2個模塊組塊可以一起愉快:)工作分配側(更大的塊)中,一旦在節點(較小的塊)。所有的網絡資料都由Gearman處理。

基本上,沒有必要爲我寫的作業分配方面,當使用Gearman :: XS已經是相當不錯的。這是我的計劃。我會盡快寫關於Gearman :: XS + MCE的。

BTW:人們可以做類似的事情GRID-機+ MCE我想象。 MCE的優點在於最大化任何給定節點上的所有可用內核。

關於MCE的另一個神奇之處是,例如,可能不希望200個節點* 16名工作人員全部從NFS服務器讀取/寫入。這會極大地影響NFS服務器。 BTW:RHEL 6.4將包含pNFS(並行NFS)。使用MCE,工作人員可以調用「do」方法來序列化來自NFS的寫入/讀取。因此,而不是200×16 = 3200攻擊NFS,變得在任何給定時間(1每物理節點)針對NFS服務器僅200最大請求數。

當寫MCE,寬限期可以應用在很多場景。我需要更多的維基添加到MCE的主頁MCE at code.google.com。此外,MCE早餐吃的真的很大的日誌文件:)請參閱examples目錄下的egrep.pl和wc.pl。它甚至可以在連續的IO(許多工作人員中強大的slurp IO)上擊敗廣泛的查找器項目。

退房包含在MCE分佈images。哦,不要忘了查看主要的Gearman網站。

此後還剩下些什麼? Humm,網頁片斷。想到的一個想法是使用Mojo。有很多選擇。這僅僅是一個:

的Gearman :: XS + MCE + Mojolicious

再次,如果能想通過SSH進行通訊使用GRID-機代替的Gearman :: XS的。

無論如何,這是我的計劃使用已經可用的作業分配模塊。對於MCE,我的重點是在單個節點上最大限度地提高性能 - 包括分塊,序列化,銀行排隊模型,用戶任務(允許多個角色),工作者中的數字排序以及順序slurp IO。

- 馬里奧

0

Argon可以提供你正在尋找的東西(免責聲明 - 我是作者)。它允許您建立一個任意的工作者網絡,每個工作者網絡都運行一個進程池(使用Coro::ProcessPool)。

創建任務很簡單:

use Argon::Client; 

my $client = Argon::Client->new(host => "somehost", port => 8000); 
my $result = $client->queue(sub { 
    use My::Work::Module qw(do_work); 
    my $task_id = shift; 
    do_work($task_id); 
});