1、數據源介紹數據庫
某日誌平臺,詳細的記錄了數據庫使用者的下列數據:工具
用戶編號測試
訪問時間日誌
登陸終端內存
訪問模塊ci
訪問內容資源
如:用戶1000001在2016-08-08 08:08:08經過192.168.3.1訪問了A10001系統,查詢了2016-08-01到2016-08-07日的流水記錄;在2016-08-08 18:08:08經過192.167.3.1訪問了A10002系統,查詢了2016-07-01到2016-08-07日的流水記錄;…數據分析
此日誌平臺的特色:it
日誌量大:單日產生1億條數據集羣
數據不均:個別用戶單日數據量百萬級別
2、相關經驗總結
FEA進行數據分析的方式是:把DF二維表格加載進入內存,而後進行計算,優勢是在計算機內存愈來愈大的今天,分析人員能夠構建複雜的數據模型,而無需擔憂工具可否實現,…,
FEA面臨的新困難或者瓶頸是,數據量總會壓爆內存,加載速度也有限制,…,特別是在計算資源有限的狀況下(內存32G,數據量2T),筆者曾經遇到的狀況是:
加載800萬條數據,進行提取關鍵詞、分類彙總操做,FEA總用時10分鐘;可是加載2億條數據的時候,按照處理800萬條數據量的方法,發現目標沒法達成:
數據加載不完,集羣宕機
數據丟失,計算出錯
3、處理思路
數據
FEA節點
如上圖示例,億級數據總共分佈在15*15*4=900數據塊裏面,每塊的數據量大小不一,9個FEA節點,單個節點一次能夠加載200萬條數據(集羣穩定與可靠起見,FEA節點處理200萬條數據是可靠的)
處理思路是這樣的:若是某個5*5數據塊數據量超過某必定值如200萬,就一塊一塊加載,若是某5*5塊數據加起來不超過200萬條數據,就一塊兒加載
4、FEA實現
1. 計算目標
筆者要在此日誌平臺上完成一個操做,在哪一天,哪一個小時,哪一個用戶,哪一個終端,哪一個系統,訪問了多少次
2. 閾值設定
筆者的處理思路是:在一年的時間內,若是單日的數據量小於40萬條,就按日加載,若是單日的數據量大於等於40萬條就分小時加載
3.模型邏輯圖
原始數據須要經過適當的判斷,變成邏輯分片,如2016-01-01 00:00:00-00:59:59,…, 2016-01-01 23:00:00-23:59:59, 2016-01-02, 2016-01-03
邏輯上可行,要FEA實現,加載語句是帶有參數的,因此須要處理
每一次運行的結果須要單獨儲存在硬盤上,分片結果須要按照邏輯分片從新加載,造成最終結果
4. 實現細節
map實現
第一步就是利用es集羣按日統計數據,
已經知道每一天的數據量,下一步就是按照選擇大於等於40萬的日期,進一步按小時細分
第二步
已經對訪問量大於等於40萬的日期,實現了按時細分,下一步是把訪問量小於40萬的日期給合併進來
此表a就是邏輯分片表,no列是添加的編號,便於分片結果的保存,也是reduce實現過程的過程的關鍵
cluster實現
邏輯規則比較複雜的話,FEA實現cluster運算的關鍵是加載語句的不一樣,如面語句實現的核心是,若是某一日不按時加載,$spc就是空格
集羣運算
reduce實現
b表就是咱們要的最終結果
5、數據驗證
筆者在city=3306數據上,測試了2015-12-01,到2016-12-01的數據131,767,357條數據,運行2小時,沒有丟失一條數據,成功達成目標。