11

我有一個程序執行數千個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-emraws-elastic-mapreduce

+0

對我的答案有任何意見?是100號固定? – Deepak

回答

1

有趣的情況..喜歡閱讀這個問題的詳細信息..基本上,我們尋找CPU負荷的負荷,但短期...應該可以很快..基本問題,如果我們真的認識到lambda是它不支持線程並且不支持異步行爲。

想過它.. Lambda看起來是正確的方式..如果你接受dynamodb的幫助(不需要另一個數據庫,因爲需求非常小;爲什麼要爲此另一個ec2實例)..每當lambda函數完成它並更新dynamodb中的記錄..並且如果db中的此值超過100 - >執行您的最終lambda函數..

數字是否固定爲100?或者它可以是任何數字......如果它可以是任何數字n;那麼我能想到的解決方案來處理太..

解決您的問題,「API調用發生的λ0和u需要對回答」是的λ0應該是這個樣子:

for (int i = 0 ; i < n ; i++){ 
    invoke processinglambda[i]; // each processingLambda process and updates 
           // results in dynamodb 
} 
while (true) { 
(if work is done by ALL processing lambdas){ 
    //collate all data 
    return result; 
    } 

} 

所以,我們基本上試圖使用上面的設計來實現MapReduce .. Lambda 0是主節點;它將作業委派給節點lambda 1..N ...,它們在dynamodb中進行處理並保持更新結果。主節點;如果所有子節點都完成了工作,請繼續查詢dynamodb。完成後;主節點會整理所有數據並返回響應。

+0

這個數字不是固定的,但我會假設目標也可以存儲在數據庫中。然而,問題仍然是如何從最終的lambda返回HTTP的結果,產生許多結果並不是主要問題 - 我知道該怎麼做,而不是如何從不同的lambda響應收到發起請求。 –

+0

我現在基本上在想,我需要轉向異步設計,這需要對前端進行相當的重寫,目前與同步的不同後端一起工作;或者沿着lambda-as-a-coordinator路線走。我實際上已經實現了(儘管我有超時和結果長度問題與這個問題無關)。我希望很快就能有一個堅定的解決方案(因爲我需要它,並且我知道一個答案需要接受)。 –

+0

讓我知道如果我可以有任何幫助 – Deepak

2

一個想法是通過API GW調用Lambda函數(稱爲'工作流指導'),然後在該函數中編寫代碼以直接調用步驟函數(或其他)並輪詢狀態,以便最終可以同步響應到HTTP請求。

這只是異步工作流程的同步包裝。請記住,API GW在29秒內有一個硬超時,所以如果您預計此工作流程需要大約30秒,則實施同步版本可能不值得。

異步模型(我猜在這種情況下,直接從API GW調用step函數)可以在任何情況下工作。

編輯:對不起,您可能誤解了您對step功能的評論。我認爲沒有同步的方式來調用步驟功能工作流程,並等待最終狀態,但從您的評論看來,已經存在。

讓我很快地回答了幾個您的具體問題:

有沒有辦法後,斷火的S3的結果,也就是說,100個文件被寫入到一個文件夾,而不是以後每一個?

我相信這是不可能的。

我不知道怎麼火併聯了很多lambda算一步到位,讓他們的狀態機

你在文檔中看到在此之前所有的回報? http://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-parallel-state.html

+0

我沒有在文檔中看到,沒有。我嘗試了很多不同的搜索,雖然我沒有從封面到封面全部閱讀,謝謝。我會再次嘗試使用該方法的步驟功能。 –

+0

另外,您對階梯功能的誤解可能來自我的誤解。事實證明,從我嘗試基於指針實現該路線,該步驟函數不能同步返回它們的結果。他們做的回報基本上是對結果最終將存儲供您輪詢的操作的參考。我誤以爲結果本身是同步返回的。 –

相關問題