潛水到Apache火花流的執行模型
有這麼多分布式流處理引擎可用,人們經常問我們的獨特的好處Apache火花流。從早期開始,Apache火花本身提供了一個統一的引擎,支持批處理和流媒體的工作負載。這是不同於其他係統,要麼隻有為流處理引擎設計,或有類似的批處理和流api但內部編譯不同的引擎。火花的單一批量執行引擎和統一的編程模型和流導致一些獨特的好處超過其他傳統流媒體係統。特別是,四個主要方麵:
- 從失敗中快速恢複和掉隊
- 更好的負載平衡和資源使用
- 結合流媒體數據與靜態數據集和交互式查詢
- 本地集成先進的加工庫(SQL、機器學習、圖像處理)
在這篇文章中,我們概述火花流的體係結構和解釋它如何提供上述好處。我們也討論一些有趣的正在進行的工作項目,利用執行模型。
流處理架構,舊的和新的
在高級別上,現代分布式流處理管道執行如下:
- 收到流數據從數據源(如生活日誌,係統遙測數據,物聯網設備數據,等等)到一些數據攝取係統像Apache卡夫卡,亞馬遜運動等。
- 過程數據並行集群上。這就是流處理引擎設計,我們將詳細討論。
- 輸出結果下遊係統像HBase,卡桑德拉,卡夫卡,等等。
處理數據,大多數傳統的流處理係統的設計連續操作模式工作如下:
- 有一組的工作節點,每一個都運行一個或多個連續操作。
- 每個連續的操作符處理流數據一次一條記錄,並將記錄轉發給其他運營商的管道。
- 有“源”運營商從攝取係統接收數據,並向下遊係統“下沉”操作符輸出。
連續操作符是一個簡單的和自然模型。然而,今天的趨勢更大的規模和更複雜的實時分析,這種傳統建築也遇到了一些挑戰。我們設計了火花流滿足以下要求:
- 快速失敗和流浪者複蘇——以更大的規模,有一個更高的集群節點失敗的可能性或不可預知的減速(流浪漢)。係統必須能夠自動從故障中恢複和流浪漢提供實時的結果。不幸的是,連續的靜態分配操作工人節點使它具有挑戰性的傳統係統從故障快速恢複和掉隊。
- 負載平衡——之間的處理負載人員分配不均會導致在連續操作係統瓶頸。這是更可能發生在大型集群和動態工作負載。係統需要能夠根據工作負載動態調整資源分配。
- 統一的流,批處理和互動的工作負載——在許多用例,這也是吸引查詢流數據交互(畢竟,流媒體係統在內存),或把它與靜態數據集(如預先計算模型)。這是困難的在連續操作係統設計的動態引入新運營商特別查詢。這需要一個引擎,可以結合批處理,流和交互式查詢。
- 先進的分析和機器學習和SQL查詢——更複雜的工作負載需要不斷學習和更新數據模型,甚至查詢流數據的“最新”視圖使用SQL查詢。再一次,有一個常見的抽象在這些分析任務使開發人員的工作更加容易。
為了解決這些需求,引發流使用一個新的體係結構離散流直接利用豐富的圖書館和容錯的火花引擎。
火花流體係結構:離散流
而不是處理流數據一次一條記錄,火花流可流數據成小,次秒級micro-batches。換句話說,火花並行流的接收器接受數據和緩衝火花的工人節點的內存。然後latency-optimized引發引擎運行短任務(幾十毫秒)過程的批次和輸出結果到其他係統。注意,不像傳統的連續算子模型,計算靜態分配的一個節點,火花任務動態分配給工人們基於數據的局部性和可用資源。這使得更快更好的負載平衡和故障恢複,我們會說明下。
此外,每一批的數據是一個彈性分布式數據集(抽樣),這是基本的抽象容錯數據集的火花。這使得處理流數據使用任何火花或庫代碼。
離散流處理的好處
讓我們來看看這個架構允許火花流達到我們設定的目標。
動態負載均衡
將數據分成小micro-batches允許細粒度分配計算資源。例如,考慮一個簡單的工作負載,輸入數據流需要分區鍵和加工。在傳統record-at-a-time大多數其他係統所采取的方式,如果其中一個分區比其他人更多的計算量,分配給進程的節點靜態分區將成為一個瓶頸,降低管道。引發流,工作的任務將會自然的工人之間進行負載平衡,一些工人將處理一些任務,其他人將過程更短的任務。
快速失敗和流浪者複蘇
在節點故障的情況下,傳統的係統重新啟動失敗的另一個節點上連續算子和回放部分數據流驗算丟失的信息。請注意,隻有一個節點處理重新計算,和管道無法繼續進行,直到新節點後回放。在火花,計算已經離散成小,確定性的任務可以在任何地方運行而不影響正確性。所以可以重新啟動失敗的任務在平行在集群中的所有其他節點,從而均勻分配所有的重新計算在許多節點,和從失敗中恢複的速度比傳統方法。
統一批、流和交互式分析
火花的關鍵編程抽象流DStream,或分布式流。每批抽樣流數據表示,這是引發一個分布式數據集的概念。因此DStream隻是一係列抽樣。這個公共表示允許批處理和流負載無縫互操作。用戶可以將任意的火花函數應用於每批流數據:例如,它很容易加入一個DStream預先計算的靜態數據集(作為一個抽樣)。
//創建數據集從Hadoop文件val數據集=sparkContext.hadoopFile(“文件”)//加入每一個批處理在流與數據集kafkaDStream。變換{batchRDD=>batchRDD.join(數據集)。過濾器(…)}
自批流數據存儲在火花的工人內存,它可以交互式地查詢需求。例如,您可以讓所有通過流狀態火花SQLJDBC服務器,在下一節中我們將展示。這種統一的批處理,流在火花和互動的工作負載很簡單,但很難實現這些工作負載的係統沒有一個共同的抽象。
先進的分析和機器學習和交互式SQL
火花互操作性延伸到豐富的圖書館像MLlib(機器學習),SQL, DataFrames, GraphX。讓我們探索一些用例:
流+ SQL和DataFrames
抽樣由DStreams可以轉化成DataFrames(火花SQL編程接口),並與SQL查詢。例如,使用SQL的火花JDBC服務器,你可以公開的狀態流會談任何外部應用程序的SQL。
val hiveContext =新HiveContext (sparkContext)/ /……wordCountsDStream。foreachRDD {抽樣= >/ /轉換隨機數字撥號改為DataFrame並注冊它作為SQL表val wordCountsDataFrame = rdd.toDF (“單詞”,“數”)wordCountsDataFrame.registerTempTable (“word_counts”)}/ /……/ /啟動JDBC服務器HiveThriftServer2.startWithContext (hiveContext)
然後你可以交互式地查詢不斷更新“word_counts”表通過JDBC服務器,使用直線客戶機附帶火花,或表等工具。
>顯示表;+- - - - - - - - - - - - - + - - - - - - - - - - - - - +|的表|isTemporary|+- - - - - - - - - - - - - + - - - - - - - - - - - - - +|word_counts|真正的|+- - - - - - - - - - - - - + - - - - - - - - - - - - - +1行選擇(0.102秒)>選擇*從word_counts;+- - - - - - - - - - - - - - - - - - - - - - + +|詞|數|+- - - - - - - - - - - - - - - - - - - - - - + +|2015年|264年||PDT|264年||21:45:41|27|
流+ MLlib
機器學習模型生成離線MLlib可以應用於流媒體數據。例如,下麵的代碼列車KMeans聚類模型和一些靜態數據,然後使用該模型對事件進行分類在卡夫卡數據流。
/ /離線學習模型= KMeans val模型。火車(數據集,…)/ /應用模型在線val kafkaStream = KafkaUtils.createDStream (…)kafkaStream。{地圖事件= >model.predict (featurize(事件)}
我們證明這offline-learning-online-prediction火花峰會2014磚演示。從那時起,我們還添加了流媒體在MLLib機器學習算法,可以從一個標簽的數據流持續訓練。其他火花庫也可以很容易地從引發流。
性能
鑒於火花流的獨特設計,運行的速度有多快?在實踐中,火花流批處理數據的能力,利用火花會導致類似或引擎更高的吞吐量其他流媒體係統。的延遲,火花流可以實現延遲低至幾百毫秒。開發人員有時會問是否micro-batching本質上增加了太多的延遲。在實踐中,批處理延遲隻是一小部分管道的端到端延遲。例如,許多應用程序計算結果在一個滑動窗口,即使在連續操作係統,這個窗口隻是定期更新(如20秒窗口,幻燈片每2秒)。許多管道從多個來源收集記錄,等待一段過程推遲或無序的數據。最後,任何自動觸發算法往往會等待一段時間觸發器。因此,相比,端到端延時,配料很少增加顯著的開銷。事實上,吞吐量收益DStreams往往意味著需要更少的機器來處理相同的工作負載。
火花流媒體未來的發展方向
火花流是一種最廣泛使用的組件在火花,為流媒體用戶和有更多。最高優先級的項目我們的團隊正在討論如下。你可以期待在接下來的幾個版本的火花:
- 反壓力——流工作負載可以經常爆發的數據(如突然激增推在奧斯卡獎)和處理係統必須能夠優雅地處理它們。在即將到來的火花1.5版本(下個月),火花將更好的反壓力機製,允許添加火花流動態控製攝入率這樣的爆發。這個特性代表了我們之間的合作在磚和工程師的類型安全。
- 動態擴展——控製攝入率可能不足以處理時間條件數據速率的變化(如白天推率持續高於晚上)。這樣的變化可以由動態擴展集群資源根據加工要求。這是非常容易做到火花串流架構內,由於計算已經分成小任務,他們可以動態地分配給一個更大的集群,如果更多的節點獲得集群管理器(紗、便、Amazon EC2等)。我們計劃增加支持自動縮放。
- 事件時間和無序的數據——實際上,用戶有時有記錄的順序傳遞,或與一個不同於攝取的時間的時間戳。火花流將支持“事件”,允許用戶定義的時間提取功能。這將包括一個鬆弛時間為晚或無序的數據。
- UI的改進——最後,我們想要方便開發人員調試他們的流媒體應用程序。為此,在火花1.4中,我們添加了新的可視化流火花UI讓開發人員密切關注他們的應用程序的性能。在火花1.5中,我們進一步提高通過展示更多輸入信息就像卡夫卡補償在每一批處理。