本文介紹了在星環大數據平臺TDH中實現實時數據處理的原理.
1.? 什么是流數據?
流式處理中假定流入系統的數據是持續不斷的。它具有以下幾個特點:
數據實時到達;
數據到達次序獨立,不受應用系統所控制;
數據規模宏不能預知其最大值;
數據一經處理,除非特意保存,否則不能被再次取出處理,或者再次提取數據代價昂貴。
流數據在網站監控和網絡監控;、信息系統異常檢測、網頁監控和金融服務等應用領域廣泛出現,通過對流數據研究可以進行衛星云圖監測、股市走向分析、網絡攻擊判斷等。
在實際應用中,流數據的來源繁多,包括:TCP socket,Kafka,Flume,Twitter等。流數據通過Spark核心API、DataFrame SQL或者機器學習API處理,并可以持久化到本地文件、HDFS、數據庫或者其它任意支持Hadoop輸出格式的形式。
圖:數據流向示意圖
2.流數據處理框架
在Spark技術被廣泛接受之前,數據處理中的一大難題就是如何將批處理和實時處理結合起來。為了解決這個難題,人們提出了很多解決方案。隨著Spark技術的發展,流數據計算系統和全量計算系統的統一成為了可能。Spark本身可以用于批處理,而構建在Kappa架構之上的Spark Streaming又可以用于實時計算,因此利用一套系統來應對批處理和實時計算相結合的業務完全是可行的。Kappa架構的核心思想包括以下三點:
用Kafka或者類似的分布式隊列系統保存數據,可以任意指定數據量保存的天數。
當需要全量重新計算時,重新建立一個流計算實例,從頭開始讀取數據進行處理,并輸出到一個新的結果存儲中。
當新的實例做完后,停止原有的流計算實例,并把原有的一些結果刪除。
圖:Kappa架構圖
如上圖所示,假設系統通過Kafka接入實時數據(日志數據、json數據等),不同類型的實時數據通過Topic區分。在系統進行流數據處理時,指定不同的處理方法StreamJob給各個Topic。通過配置每隔一定時間會從Kafka消息隊列中接收一批時序數據。這一批數據中包含了多個數據單元。當前批次的數據會被映射成一張二維關系表。通過流數據引擎處理的結果可以存在HBase等數據庫中,也可以使用內存列式存儲。應用程序可以通過SQL查詢到處理結果,進行統計分析。
圖:流數據處理流程
3. 實時數據和批量數據混合處理方案
目前,大部分的實時信息分析系統的主要任務是要在不斷產生的、海量的、格式多樣的日常交易數據中快速發現問題,最好可以在問題發生時就發出預警。傳統的數據庫由于本身結構的限制,主要通過預設的條件,例如按月或按周的形式形成報表。這樣就無法作到實時報警,快速反應。另一方面,單一使用流數據也無法利用所有有用的信息。一個高效的系統需要能夠在綜合利用歷史存量數據的情況下,快速得到分析結果。
UDF (User-Defined Functions)是便于用戶創建處理存儲在Apache Hive中的數據的一種機制。用戶可以自定義函數的輸入輸出參數。將UDF與StreamJob結合在一起使用可以實時的查詢歷史數據中相關內容用于實時數據的計算處理。隨著UDF的不斷演化,它可以被利用在其他Hadoop生態圈中的數據庫上,例如:Hyperbase,Holodesk。雖然它的效率越來越高。在實際使用過程中,工程人員也要注意UDF的優化。
圖:實時數據和批量數據的混合處理
參考: