c++分布式計算類庫


以前其它的項目組遇到了大數據計算的問題,一般計算時間都要2~3小時,甚至一整天的。於是,我便也想私下做一個C++分布式計算框架,利用多台機器分布式計算以減少計算時間。當前分布式計算框架主要有hadoop, google的map/reduce,DCOM或一些其它的框架。但這些東東實在太龐大了,我想要做的是一個滿足以下條件的框架:

1、在已有的程序框架下工作,不需要修改已有的程序代碼。

2、使用方法盡可能的簡單。

3、只需要增加一台服務器,就所有運行該軟件的機器,都可以自動的接收任務並完成分布式計算的工作。

4、分布式計算過程對使用它的程序員透明。

我的做法是:

1、使用zeromq作為通信底層。使用c++對象作為網絡傳輸的基本單位,並使用對象反射機制實現對象的解析。

2、每一個任務,即是一個對象。任務的分解(map)與歸約(reduce)的任務,則分配給了使用者本身,因為只有TA知道任務的具體算法與數據。一個任務包含了數據、算法、結果(待計算)。

3、任務分解之后,只需要簡單調用DoMultiTask(taskList, waitTime)即可。剩下的工作就是等待計算完成,然后歸約。

4、類庫接收到任務后,將其發送到主服務器,主服務器使用負載均衡算法/最近最少使用算法,將任務發放給已經注冊的工作機(worker)。工作機處理完成后返還給主機,主機返還給客戶,將結果寫入任務(task)的結果變量中。

5、所有計算完成返回,有客戶端歸約。

 

對於網絡通信底層的實現,用到了zeromq這個家伙,引用官方的說法: “ZMQ(以下ZeroMQ簡稱ZMQ)是一個簡單好用的傳輸層,像框架一樣的一個socket library,他使得Socket編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ的明確目標是“成為標准網絡協議棧的一部分,之后進入Linux內核”。現在還未看到它們的成功。但是,它無疑是極具前景的、並且是人們更加需要的“傳統”BSD套接字之上的一 層封裝。ZMQ讓編寫高性能網絡應用程序極為簡單和有趣。”。

結果證明,zeromq用起來果然不錯。

 

分布式框架做的事情就是工作機的注冊與管理、服務器(路由)的任務分發與管理,客戶端任務的發送與結果接收,類型反射等。

這樣做的優點是,不需要修改已有程序代碼,只需增加任務類即可。

當人們使用同一個軟件工作,TA願意選擇作為分布式計算客戶端,則會向服務器注冊這個機器然后被使用,程序就會運行一個線程等待任務。

 

ps:未來有一個問題需要解決:現在假定的是客戶端與工作機的類庫相同,即對象能夠成功反射。如果一個任務(對象)傳送到工作機,可是工作機沒有這個對象的反射信息,最多只能反射數據,不能動態生成任務的算法。總不能傳一段c++代碼,讓客戶機解釋執行吧?我想到的解決方法有:如果反射失敗,那么要求客戶端將類庫信息(dll)發送到工作機,工作機加載類庫,然后進行類型反射。

直接發送客戶端的類庫到工作機,顯然沒有考慮到跨平台的問題。

有想法的朋友,可以一起探討下這個問題的解決方法。

 

下面是源代碼地址,敬請指正。

https://github.com/dario-DI/DistributedCompute


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM