我正在設計一個系統,該系統應該分析大量用戶事務併產生聚合度量(如趨勢等)。該系統應該工作快速,健壯和可擴展。 系統是基於Java的(在Linux上)。實時分析處理系統設計
數據從生成用戶事務的日誌文件(基於CSV)的系統到達。 系統每分鐘生成一個文件,每個文件包含不同用戶的交易(按時間排序),每個文件可能包含數千用戶。
用於CSV文件的採樣數據結構:
10:30:01,用戶1,...
10:30:01,用戶1,...
10時30分02秒,用戶78,...
10:30:02,用戶2,...
10:30:03,用戶1,...
10:30:04,用戶2,...
。 。 。
我計劃的系統應該實時處理文件並執行一些分析。 它必須收集輸入,將其發送到多個算法和其他系統,並將計算結果存儲在數據庫中。該數據庫不包含實際的輸入記錄,而僅包含關於交易的高層彙總分析。例如趨勢等。
我打算使用的第一個算法要求最佳操作至少10條用戶記錄,如果在5分鐘後找不到10條記錄,則應該使用所有可用數據。
我想用Storm來實現,但我寧願儘可能在設計層面上討論這個問題。
系統組件列表:
監視每分鐘輸入的文件的任務。
一個讀取文件的任務,解析它並使其可用於其他系統組件和算法。
一個組件爲用戶緩衝10條記錄(不超過5分鐘),當收集10條記錄或5分鐘過去時,是時候將數據發送給算法進行進一步處理。 由於要求爲該算法提供至少10條記錄,因此我想到了使用Storm Field Grouping(這意味着爲同一用戶調用相同的任務)並跟蹤任務內的10個用戶記錄的集合,當然我計劃有幾個這些任務,每個處理一部分用戶。
還有其他的組件可以在單個事務上工作,對於他們我計劃創建其他任務,以便在解析每個事務(與其他任務並行)時接收每個事務。
我需要你的幫助#3。
設計此類組件的最佳做法是什麼? 很明顯,它需要維護每個用戶10條記錄的數據。 鍵值映射可能會有所幫助,在任務本身中管理映射還是使用分佈式緩存更好? 例如Redis是一個關鍵的價值存儲(我以前從未使用過)。
感謝您的幫助