我有一個程序執行數千個monte-carlo模擬來預測結果;我不能說他們真的預測了什麼,所以我會用另一個來自「聖誕老人無可爭辯的存在」的例子,因爲這些算法的內容與問題無關。我想知道壟斷委員會上每個廣場的訪問頻率(以預測哪個最好的房產是購買的)。爲此,我模擬數千場比賽並整理結果。我目前的實現是一個獨立的C#應用程序,但我想將它移動到雲中,以便我可以將其作爲服務提供 - 每個用戶都可以通過提交每個骰子所具有的邊數來獲得個性化結果。如何將mapreduce操作的結果返回給AWS API請求
當前的實現也很慢 - 它是非常複雜的,因爲每個模擬是完全獨立的,但我只有8個核心,所以它需要20分鐘的時間才能完成預測,在本地計算機上進行大約50000次單獨模擬。
該計劃是讓AWS lambda函數運行一個(或多個)模擬,然後整理 - 基本上是mapreduce它。我着眼於使用AWS EMR(Elastic MapReduce),但是對於我想要的規模來說太大規模,旋轉實例來單獨運行計算似乎需要比單獨計算更長的時間(這對於多核處理器來說並不重要)小時離線分析,但我希望通過網絡請求進行低延遲響應)。
我看到這將是理想的:
LAMBDA 0 - 關閉觸發許多其他lambda函數,各做計算的一小部分。 Lambda 1..N - 並行進行許多模擬(數字不是常數)。 Lambda N + 1 - 整理所有結果並返回答案。
有一個lambda MapReduce框架這裏:
https://github.com/awslabs/lambda-refarch-mapreduce
但它似乎有一個主要的缺點 - 每一個地圖階段完成時,它把結果給S3(我很好用那作爲一個臨時的)然後通過一個事件觸發一個新的lambda。這引發了lambda看起來是否所有的結果都寫入存儲了。如果沒有,則結束,如果是,則執行還原步驟。這似乎是一個公平的解決方案,但我只是稍微關注a)當兩個結果一起出現時的種族危害,兩個減速器是否可以計算結果?而且b)似乎它正在解僱許多隻是決定不運行的lambda(我知道它們運行起來很便宜,但是將每次模擬的數量加倍到兩個 - 計算並可能減少 - 顯然會使成本增加一倍)。在將100個文件寫入文件夾而不是每個文件夾之後,有沒有辦法讓S3結果發出?
我看着使用步進函數,但我不知道如何在一個步驟中並行觸發許多lambda,並讓它們在狀態機轉換之前全部返回。然而,步驟函數對於最終的皺紋是有用的 - 我想隱藏所有這些背後的API。
從我讀過的,API可以發出一個lambda並返回該lambda的結果,但我不希望被調用的lambda是返回結果的那個。這不是在你調用API的step函數時,而是由API調用返回最後狀態的結果。
總之,我想:
API請求 - >計算並行結果 - > API響應
它是在中間,我不太清楚該怎麼做位,同時能夠返回所有結果作爲對原始請求的迴應 - 無論是自己的都很容易。
有幾個選項,我可以看到:
使用一個階躍函數,它是原生的AWS API網關現在支持,並在一個狀態中調用多個lambda表達式,等待他們全部轉移之前返回。
使用AWS EMR,但以某種方式保持供應的實例始終有效以避免供應時間開銷。這顯然否定了Lambda的可擴展性,並且更昂貴。
使用mapreduce框架或類似的東西,並找到一種方法來響應來自不同lambda的傳入請求,該請求最初由API請求調用。理想情況下,還可以減少此處涉及的S3事件的數量,但這不是優先事項。
立即響應來自第一個lambda的原始API請求,然後在計算完成時將更多數據推送給用戶(他們應該只需要約30秒的並行性,並且該域是可以接受的等待響應的時間,甚至是HTTP響應)。
我懷疑這將使得該解決方案的任何區別,因爲它僅僅是中間位,而不是根本性變化的擴張,但真正的計算是迭代的,所以應該是:
請求 - >的MapReduce - > Mapreduce - > ... - >響應
只要我知道如何在請求中鏈接一組lambda函數,鏈接更多應該只是更多相同(我希望)。
謝謝。
P.S.我無法創建它們,也沒有標籤aws-emr
和aws-elastic-mapreduce
。
對我的答案有任何意見?是100號固定? – Deepak