2017-05-26 138 views
1

我想在csv文件中可用的多個數據集上運行多個算法。所以我想擴大ec2實例,以便所有實例可以在不同的數據集上並行運行。我試圖找出一種擴大ec2實例並將不同數據集(.csv)粘貼到每個實例的方法。 注意:我不想實現排隊系統並使用數據庫。ec2實例旋轉另一個ec2實例並推送一個csv文件

+0

想想配置管理工具,如ansible,puppet,chef,salt,來歸檔您的請求。 – BMW

回答

1

這種模式通常包括:

  • 中央系統「推」工作成某種形式存儲的那就是所有情況下,諸如Amazon SQS隊列
  • 一種自動縮放訪問組,它維護所需數量的Amazon EC2實例(使用可選規則更改基於度量標準的實例數)
  • A 啓動腳本每個實例運行你的應用程序
  • 拉從隊列工作的應用程序,處理它,結果某處存儲(例如,在數據庫或亞馬遜S3)並重復進行處理

你應該把你的源數據(例如CSV文件)並將其推送到Amazon SQS隊列中的單個工作塊。該消息可以包含實際的輸入數據,也可以包含指向存儲在Amazon S3中的文件的鏈接。

在每個亞馬遜EC2實例的運行將從該隊列請求的消息,獲取源數據,如果它是存儲在亞馬遜S3,處理數據,存儲輸出某處的應用,然後告訴SQS隊列刪除郵件。如果應用程序失敗,那麼Amazon SQS將在預定的「隱形」期限後自動將消息放回隊列中。

沒有數據庫或隊列

你說你不想使用數據庫或一個排隊系統,但你不說,爲什麼是這樣的情況。如果是爲了避免成本,那麼請注意,一個隊列將花費你幾分錢。數據庫也可以是非常低的成本。

您可以使用Amazon S3存儲工作,每個應用程序實例都會抓取要處理的文件。應用程序將刪除文件,處理工作,然後將結果存儲到Amazon S3中。

您將有效地將Amazon S3用作僞數據庫和工作隊列。

此方法的問題是應用程序可能失敗,導​​致工作丟失,並且應用程序的多個實例可能會嘗試同時獲取同一工作項,從而導致重複工作。 Amazon SQS有助於避免這兩種情況。

推送文件到實例

你的問題詢問有關推動CSV文件實例。這是一個非常差的建築設計,應該避免。與其讓中央系統「推」工作,讓個體工作人員「拉」工作總是更加健壯,因爲他們知道什麼時候可以消耗更多的工作。它也簡單得多,因爲將信息推送到實例需要一種可靠的方法來接收工作,這比創建一個完全管理的集中式隊列要複雜得多。

紡紗了一個「工人」的EC2實例

最壞的情況,你可以旋轉,一個單獨的EC2實例每個工作的「塊」。如果工作定義很小,則可以將其作爲用戶數據的一部分傳遞給它。如果工作定義很大,則將其存儲在Amazon S3中,並通過用戶數據或通過啓動時分配給該實例的標籤傳遞對該實例的引用。 (實例可以在啓動時檢查自己的標籤,檢索參考,然後從S3中檢索數據。)

該方法的缺點是EC2按小時計費,因此每個實例都執行一次「大塊的工作可能會變得更加昂貴,特別是如果他們只需要一小時的時間來操作。

使用AWS LAMBDA

而不是使用Amazon EC2上的,另一種選擇是使用AWS lambda函數。一個優雅的方法是將每個工作塊作爲一個對象存儲在Amazon S3中。這可以觸發AWS Lambda函數處理輸入文件並將輸出存儲在某處(例如,在另一個S3存儲桶中)。但請注意,Lambda函數最多隻能運行5分鐘,這可能不適用於您的使用情況。

+0

非常感謝您的詳細解答。我同意你指出的每一個具體的存在。僅僅爲了給你一個想法,避免隊列和數據庫背後的原因是因爲代碼將成爲已經實現了排隊系統的數據管道的一部分,所以增加另一個隊列可能是失敗點。對於數據庫,因爲有大約100K類似的任務,所以查詢會增加開銷。所以我試圖找到一種方法,讓我可以在啓動後發佈大量數據,以便實例可以處理專門的任務。 –

+1

最糟糕的情況是,您可以爲每個工作塊創建單獨的EC2實例,並通過用戶數據傳遞工作(或S3參考)。但是,這不是很健壯。 –

+0

同意。你有鏈接到任何這樣的有用的例子嗎? 同樣在做了一些研究之後,我認爲更多的解決方案可能是爲每個實例創建單獨的EBS,複製相關文件,然後將卷附加到實例。讓我知道如果這是可行的,或者如果你有任何有用的資源。 –