談談流計算
目前對信息高時效性、可操作性的需求不斷增長,這要求軟體系統在更少的時間內能處理更多的數據。傳統的大數據處理模型將在線事務處理和離線分析從時序上將兩者完全分割開來,但顯然該架構目前已經越來越落後於人們對於大數據實時處理的需求。
1. 什麼是流計算?
流計算的產生即來源於對於上述數據加工時效性的嚴苛需求: 數據的業務價值隨著時間的流失而迅速降低,因此在數據發生後必須儘快對其進行計算和處理。而傳統的大數據處理模式對於數據加工均遵循傳統日清日畢模式,即以小時甚至以天為計算周期對當前數據進行累計並處理,顯然這類處理方式無法滿足數據實時計算的需求。在諸如實時大數據分析、風控預警、實時預測、金融交易等諸多業務場景領域,批量(或者說離線)處理對於上述對於數據處理時延要求苛刻的應用領域而言是完全無法勝任其業務需求的。而流計算作為一類針對流數據的實時計算模型,可有效地縮短全鏈路數據流時延、實時化計算邏輯、平攤計算成本,最終有效滿足實時處理大數據的業務需求。
什麼是流數據 ?從廣義上說,所有大數據的生成均可以看作是一連串發生的離散事件。這些離散的事件以時間軸為維度進行觀看就形成了一條條事件流/數據流。不同於傳統的離線數據,流數據是指由數千個數據源持續生成的數據,流數據通常也以數據記錄的形式發送,但相較於離線數據,流數據普遍的規模較小。流數據產生源頭來自於源源不斷的事件流,例如客戶使用您的移動或 Web 應用程序生成的日誌文件、網購數據、遊戲內玩家活動、社交網站信息、金融交易大廳或地理空間服務,以及來自數據中心內所連接設備或儀器的遙測數據。
通常而言,流計算具備三大類特點:
- 實時(realtime)且無界(unbounded)的數據流
流計算面對計算的 是實時且流式的,流數據是按照時間發生順序地被流計算訂閱和消費。且由於數據發生的持續性,數據流將長久且持續地集成進入流計算系統。例如,對於網站的訪問點擊日誌流,只要網站不關閉其點擊日誌流將一直不停產生並進入流計算系統。因此,對於流系統而言,數據是實時且不終止(無界)的。
- 持續(continuos)且高效的計算
流計算是一種」事件觸發」的計算模式,觸發源就是上述的無界流式數據。一旦有新的流數據進入流計算,流計算立刻發起並進行一次計算任務,因此整個流計算是持續進行的計算
- 流式(streaming)且實時的數據集成
流數據觸發一次流計算的計算結果,可以被直接寫入目的數據存儲,例如將計算後的報表數據直接寫入RDS進行報表展示。因此流數據的計算結果可以類似流式數據一樣持續寫入目的數據存儲。
2. 流計算全鏈路
流計算全鏈路整體上更加強調數據的實時性,包括數據實時採集、數據實時計算、數據實時集成。三大類數據的實時處理邏輯在全鏈路上保證了流式計算的低時延。全鏈路流計算示意圖如下:
- 數據採集 用戶使用流式數據採集工具將數據流式且實時地採集並傳輸到大數據消息Pub/Sub系統,該系統將為下游流計算提供源源不斷的事件源去觸發流式計算作業的運行。
- 流式計算 流數據作為流計算的觸發源驅動流計算運行。因此,一個流計算作業必須至少使用一個流數據作為源。一批進入的數據流將直接觸發下游流計算的一次流式計算處理。
- 數據集成 流計算將計算的結果數據直接寫入目的數據存儲,這其中包括多種數據存儲,包括數據存儲系統、消息投遞系統,甚至直接對接業務規則告警系統發出告警信息。不同於批量計算(例如阿里雲MaxCompute或者開源Hadoop),流計算天生自帶數據集成模塊,可以將結果數據直接寫入到目的數據存儲。
- 數據消費 流計算一旦將結果數據投遞到目的數據源後,後續的數據消費從系統劃分來說,和流計算已經完全解耦。用戶可以使用數據存儲系統訪問數據,使用消息投遞系統進行信息接收,或者直接使用告警系統進行告警。
3. 流計算和批量計算對比
3.1 批量計算
目前絕大部分傳統數據計算和數據分析服務均是基於批量數據處理模型: 使用ETL系統或者OLTP系統進行構造數據存儲,在線的數據服務(包括Ad-Hoc查詢、DashBoard等服務)通過構造SQL語言訪問上述數據存儲並取得分析結果。這套數據處理的方法論伴隨著關係型資料庫在工業界的演進而被廣泛採用。但在大數據時代下,伴隨著越來越多的人類活動被信息化、進而數據化,越來越多的數據處理要求實時化、流式化,當前這類處理模型開始面臨實時化的巨大挑戰。傳統的批量數據處理模型傳統的批量數據處理通常基於如下處理模型:
- 使用ETL系統或者OLTP系統構造原始的數據存儲,以提供給後續的數據服務進行數據分析和數據計算。即下圖,用戶裝載數據,系統將根據自己的存儲和計算情況,對於裝載的數據進行索引構建等一系列查詢優化工作。因此,對於批量計算,數據一定需要預先載入到計算系統,後續計算系統才在數據載入完成後方能進行計算。
- 用戶/系統主動發起一個計算作業(例如MaxCompute的SQL作業,或者Hive的SQL作業)並向上述數據系統進行請求。此時計算系統開始調度(啟動)計算節點進行大量數據計算,該過程的計算量可能巨大,耗時長達數分鐘乃至於數小時。同時,由於數據累計的不可及時性,上述計算過程的數據一定是歷史數據,無法保證數據的」新鮮」。用戶可以根據自己需要隨時調整計算SQL,甚至於使用AdHoc查詢,可以做到即時修改即時查詢。
- 計算結果返回,計算作業完成後將數據以結果集形式返回用戶,或者可能由於計算結果數據量巨大保存著數據計算系統中,用戶進行再次數據集成到其他系統。一旦數據結果巨大,整體的數據集成過程漫長,耗時可能長達數分鐘乃至於數小時。
批量計算是一種批量、高時延、主動發起的計算。 用戶使用的批量計算的順序是:
- 預先載入數據。
- 提交計算作業,並且可以根據業務需要修改計算作業,再次提交作業。
- 計算結果返回。
3.2 流式計算
不同於批量計算模型,流式計算更加強調計算數據流和低時延,流式計算數據處理模型如下:
- 使用實時數據集成工具,將數據實時變化傳輸到流式數據存儲(即消息隊列,如DataHub);此時數據的傳輸變成實時化,將長時間累積大量的數據平攤到每個時間點不停地小批量實時傳輸,因此數據集成的時延得以保證。
此時數據將源源不斷寫入流數據存儲,不需要預先載入的過程。同時流計算對於流式數據不提供存儲服務,數據是持續流動,在計算完成後就立刻丟棄。
- 數據計算環節在流式和批量處理模型差距更大,由於數據集成從累積變為實時,不同於批量計算等待數據集成全部就緒後才啟動計算作業,流式計算作業是一種常駐計算服務,一旦啟動將一直處於等待事件觸發的狀態,一旦有小批量數據進入流式數據存儲,流計算立刻計算並迅速得到結果。同時,流計算還使用了增量計算模型,將大批量數據分批進行增量計算,進一步減少單次運算規模並有效降低整體運算時延。
從用戶角度,對於流式作業,必須預先定義計算邏輯,並提交到流式計算系統中。在整個運行期間,流計算作業邏輯不可更改!用戶通過停止當前作業運行後再次提交作業,此時之前已經計算完成的數據是無法重新再次計算。
- 不同於批量計算結果數據需等待數據計算結果完成後,批量將數據傳輸到在線系統;流式計算作業在每次小批量數據計算後可以立刻將數據寫入在線/批量系統,無需等待整體數據的計算結果,可以立刻將數據結果投遞到在線系統,進一步做到實時計算結果的實時化展現。
流計算是一種持續、低時延、事件觸發的計算作業。,用戶使用流計算的順序是:
- 提交流計算作業。
- 等待流式數據觸發流計算作業。
- 計算結果持續不斷對外寫出。
3.3 模型對比
在大部分大數據處理場景下,受限於當前流計算的整個計算模型較為簡單,流計算是批量計算的有效增強,特別在於對於事件流處理時效性上,流計算對於大數據計算是一個不可或缺的增值服務。
推薦閱讀:
※Human Resources Analytics——你會是下一個辭職的嗎?
※發現有人時空旅行的證據……
※打野不參團,為什麼不去玩單機?
※Scikit-learn(sklearn) 0.19 中文文檔校驗邀請函
※發達地區的年輕男性