2011-12-16 102 views
2

請任何人都可以指出我如何設計/構建一個Web服務客戶端,它將消耗TB級數據並對檢索到的數據執行一些計算?如何使用Java RESTful客戶端消耗TB級數據

我在我的新工作中繼承了一個項目。該項目已經設計完成,並且在我加入團隊之前幾周已經開始。 該項目是關於從多個Web服務中檢索數據(其餘爲soap &),並在數據存儲到數據庫之前對數據執行一些計算,向用戶顯示並生成報告。

獲取數據的過程涉及從Web服務A,B,C提取一些數據,並使用該響應向Web服務X,Y & Z發出另一請求(我們無法控制Web服務生產者)。 當試圖對檢索到的數據進行一些計算時,當前的實現非常緩慢,大部分時間內存耗盡。數據量在TB或更多。 當前的實現使用maven/spring。

我正在爲這個項目制定一個新的設計(引入一些緩存等),但我需要以前遇到這種問題的任何人的一些建議。

除了顯而易見的是,有沒有什麼特別的技巧或方法呢? 我知道這對某些人來說可能聽起來像一個愚蠢的問題,但任何指針都會有所幫助。

+0

這些數據源中的任何一個都可能丟棄一些曾經處理過的數據?如果例如其中一條流涉及你將要處理的東西,然後不再處理,然後你將它扔掉,那麼這會對速度和記憶都有好處。 – 2011-12-16 11:05:34

回答

1

我從來沒有做過這樣的事情(雖然我很喜歡),但聽起來像你可以暫時將這些數據存儲在某種數據網格中,這種數據網格可以在許多機器上橫向擴展(所以你不用內存不足),然後在整個數據中應用聚合函數,以便在將最終結果存儲到結果數據庫中之前,獲取要查找的結果。

把我的頭,我建議尋找到CassandraHDFS用於分佈式數據網格(NoSQL的集羣),然後創造就業機會來查詢/彙總/操作這些數據Hadoop的頂部。

我希望有幫助。

+0

感謝您的回覆。但是,我不確定團隊是否會考慮設置一個hadoop集羣或者由於其所需的專業知識和時間而實施任何類型的分佈式計算。 此外,該項目不涉及存儲從Web服務檢索到的任何數據。我們存儲在數據庫中的數據是通過對來自各種Web服務的數據進行計算而生成的一些數據。 我們需要展示給用戶的是我們從Web服務獲得的內容,我們不需要將其存儲在任何數據庫中。 – 2011-12-16 10:25:32

0

處理太字節數據總是很尷尬,因爲你無法一次將所有數據全部存儲在內存中。 (好吧,不是沒有一個絕對荒謬的機器。)相反,你應該問是否有必要一次性在內存中存儲所有這些數據 - 或者甚至僅僅是一大塊數據。它可以一次處理一點嗎? (現在幾MB將被認爲是「一點點」;不要太擔心如何最大限度地減少所有的事情)如果可以的話,重新設計應用程序及其部署(有了這麼多的數據,你不能真正將它們分開),以便數據在網絡或磁盤上。

您可能想要考慮流式過濾器和變換;基於MapReduce的算法是一個很好的計劃。你有沒有看過Hadoop?是的,我知道你並不熱衷於設置類似的東西,但是你真的擁有大量的數據,而且你必須考慮正確的做法。也就是說,MapReduce只是配置過濾器和變換模式的一種方式;還有其他人。例如,您可以將後續服務請求視爲一種轉換類型,但有了這麼多的數據,您需要小心服務所有者不會將您視爲拒絕服務攻擊!您可能需要考慮使用科學的工作流程系統(KeplerTaverna),因爲它們專爲在一長串事情中執行相同的任務而設計。

您還需要小心數據傳輸;有了這麼多的數據,內置於TCP/IP中的標準校驗和算法就有很高的錯失可能性。 (幸運的是,現代硬件的實際錯誤率大部分是真的是低...)另外,處理這麼多的數據時,您需要非常小心以確保您沒有內存泄漏。即使1%的1%泄漏也可能意味着總體泄漏的GB尺寸泄漏,這可能非常明顯。

+0

披露:我爲製作Taverna的人工作。 – 2011-12-16 11:06:35