Apache Kylin在 1.5.0 推出了從流數據進行準實時(Near Real Time)處理功能,可以直接從Apache Kafka的主題(Topic)中消費數據來構建Cube。Apache Kylin 1.5.0的流處理是一次實驗性的探索,它打破了以往只能從Apache Hive表構建Cube的局限,將數據從產生到可查詢的延遲從小時級降低到了分鐘級,滿足了一些對實時性要求比較高的場景;但它在實現上存在一些局限︰
不可擴展︰ 由于是利用單個 Java 進程(而不是利用某種計算框架)對數據做處理,當遇到流數據高峰時,可能由于資源不足而導致構建失敗;可能會丟失數據︰ 由于使用一個起始時間+結束時間在Kafka隊列中使用二分查找近似地尋找消息的偏移量(offset),過早或過晚到達的消息將會被遺漏,從而使得查詢結果有誤差 ; 難以監控︰ 用于構建的任務是單獨通過shell腳本執行的,而不是像其它Cube那樣由任務引擎統一調度和執行,所以這些任務是在Web界面和REST API上都無法查詢到的,使得用戶無法方便地使用工具進行監控和管理;其它︰ 必須持續執行,如果有系統宕機將會造成某些時間窗口的任務沒有被執行,從而必須依靠管理員手動恢復;如果宕機時間較長,管理員不得不將長時間窗口切成多個小時間窗口依次來恢復,非常繁瑣 。為了克服這些限制,Apache Kylin團隊基于Kafka 0.10的API,開發了新版的準實時流式處理,它已經在內部測試了一些時間,目前正在公開測試中。
新版流式構建是在Kylin v1.5的"可插拔 "架構下的一個完美實現︰ 將Kafka主題視為一種數據源,實現相應的適配器,將數據先抽取、轉換和保存到 HDFS,接下來使用各種Kylin的構建引擎(MR/Spark等)對數據進行并行計算 。圖 1 是高層次的架構圖。
Kylin的Kafka適配器參考了kafka-hadoop-loader的思路和部分代碼, 將Kafka主題抽象成Hadoop輸入文件格式(InputFileFormat),為主題的每個分區(partition)分配一個Mapper消費數據; 之后Kylin將利用現有框架進行并行處理,從而使得方案變得可擴展且具有容錯性。
要解決"數據丟失"問題,Kylin將開始/結束消息的偏移量(offset)計入了每個Cube segment,并使用偏移量作為分區值 ,offset是順序遞增的且不能有重疊和遺漏(如果主題有多個分區,使用各分區偏移量之和作分區值);這將確保沒有數據丟失,一個消息只會被消費一次。晚到達的消息會被稍后的segment統計進來;每個Segment 有"最早時間”和"最晚時間"; 當用戶按時間條件查詢時,Kylin將掃描與查詢時間范圍相匹配的所有段。圖 2解釋了這個設計。
上圖中有三個segment,它們的offset依次連續且無重疊(左包右閉),Seg[100-400]中的消息時間跨度是1:04 – 1:11,Seg[400 - 2000]的時間跨度是1:08 – 1:40;當用戶要查詢1:10的統計信息時,Kylin發現這兩個Segment都可能有這個時間的消息,故而會掃描這兩個Segment然后再次做匯總計算。
新版流計算引擎也進行其它一些更改和增強︰
允許同時構建/合并多個segment,前后的構建任務都是獨立的自動從前一個segment或從Kafka尋找消息的開始及結束的offset 支持嵌入格式(結構化)的JSON消息 增加了觸發流式構建的REST API 增加了來檢查和部分填補segment空洞的REST API內部的集成測試結果初步驗證了當初的目標 ︰
可伸縮︰ 它能夠在一次構建中輕松處理上億條消息;靈活︰ 可以在任何時候,以你期望的頻率觸發構建,例如︰ 在白天每隔 5 分鐘觸發一次, 在夜間將頻率降低到每個小時,在需要做的維護可以隨時暫停; 由于是Kylin管理所有主題的offset,再恢復時它可以自動從上一次的結束位置繼續;穩定︰ 穩定性大大提高,在上一版中經常發生的OutOfMemory錯誤再沒有出現過; 易于管理︰ 用戶可通過Kylin的"Monitor"頁面或 REST API檢查所有構建任務的狀態; 構建性能︰相比于前一版構建時間略長(因為有Hadoop任務的調度),但延遲依然在可接受的分鐘級別。在一個小規模的測試群集 (8臺 AWS實例,消費 Twitter Sample 消息流) 中,創建一個有9個 維度和3個度量的Cube,每秒約一萬條消息,當構建間隔是 2 分鐘的時候,平均每次構建需 3 分鐘; 當構建間隔是 5 分鐘的時候,平均每次構建需要 4 分鐘; 這里是幾個測試中的截圖 ︰
總結,這是比前一版本相比更加健壯和完善的流數據OLAP 解決方案。現在你可以從Apache Kylin的下載頁面下載到 1.6.0-SNAPSHOT 的二進制包,然后按照此教程生成第一個流式Cube。
作者介紹:
史少鋒,Apache Kylin PMC 成員,核心開發人員之一,eBay高級軟件工程師,2014年加入eBay Kylin 團隊并轉向大數據分析領域,參與了Kylin一系列優化和新功能的開發,并致力為Kylin社區用戶提供支持和幫助。史少峰碩士畢業于上海交通大學計算機系,在IBM從事多年軟件全球化和云計算等方面的設計和開發。
感謝杜小芳對本文的審校。