閱讀筆記
概述:
- 本文同樣發表于2012年。提出了一種稱為離散化數據流(Discretized Streams,D-Streams)的編程模型。
- 該模型提供了一種高級函數式API,具有高度的一致性和強大的容錯能力。
- 基于Spark分布式計算框架,進行擴展實現了一個D-Stream的原型,稱為Spark Streaming。
?
研究背景:
- 許多大數據應用要求實現實時響應。
- 社交網絡應用需要在幾分鐘內分析出當前的熱點話題。
- 廣告提供商需要針對用戶對廣告的點擊行為進行建模并訓練。
- 服務器管理者需要在幾秒內從海量日志信息中分析出服務器崩潰原因等。
- 當前多數分布式流處理系統,都采用"record-at-a-time"的方式,即接收一條記錄->更新內部狀態->返回新的記錄。
- 這種方案在面臨以下幾方面的挑戰:
- 容錯:錯誤恢復涉及大量的復制操作,且占用硬件資源。
- 一致性:不同節點對數據的處理時間各不相同,需要保證計算結果的正確性
- 同批量計算系統的統一:流式計算系統是事件驅動的,同批量計算的API大不相同,難以整合。
?
主要工作:
- 提出了新的編程模型,離散化數據流(Discretized Streams, D-Streams)。
- 核心思想是將流式計算看做一系列很短時間間隔內的確定的批量計算的累積。
- 該模型的優點如下:
- 每個記錄在它來臨的時間間隔內都被系統原子處理,保證了一致性。
- 處理模型易于同批量計算系統統一起來。
- 采用批量計算的容錯處理方法,降低數據恢復代價。
- 為了保證時間劃分的粒度足夠細,響應足夠快,需要中間數據緩存在內存中。
- 為了保證容錯恢復的高效,數據在內存中以RDD的形式存放。
- 在Spark系統的支持下,時間劃分的粒度可以達到秒級別,這對于許多實際的大數據應用來說是足夠的。
- 基于Spark分布式計算框架擴展得到了Spark Streaming,是D-Stream的原型實現。
?
關于D-Stream:
- 每個時間段內接收到的數據存儲在集群上,構成了該時間段的輸入數據集。
- 時間段結束時,數據集通過確定性的并行操作處理,如map,reduce,groupBy等,得到新的數據集或計算結果。
- D-Stream提供兩種運算供用戶構建流式計算程序。
- 轉換操作: 由父數據流產生新的數據流,生成的數據可以對各個時間段獨立,也可以為所有時間段共享。這里復用了Spark提供的算如map,reduce,join等。
- 輸出操作: 將數據輸出寫到外部存儲系統(如HDFS)中,如save,foreach。
- 另外,D-Stream還提供了一些跨越時間區間的算子:
- window:將過去一段時間間隔的數據匯總得到一個新的數據集
- Incremental agggation:將過去一段時間間隔的數據按照指定的方式累加
- Time-skewed join:對過去一段時間的數據集進行連接操作。
?
注意: D-Stream的容錯機制基于RDD通過構造lineage圖實現,在最初提出Spark的論文中有詳細介紹,這里不再贅述。
?
實例:頁面訪問時間計數
實現:
pageViews = readStream("http://...", "1s")
ones = pageViews.map(event => (event.url, 1))
counts = ones.runningReduce((a, b) => a + b)
說明:
- 首先通過HTTP協議讀取事件流,生成數據集pageView。
- 然后通過map操作將數據轉換為鍵值對,生成ones,鍵為事件的url。
- 最后通過runningReduce操作進行計數。
?
關于Spark Streaming:
- 基于Spark運行時實現
- 能夠從網絡上或定期從HDFS中讀取數據流
- 使用亞馬遜EC2節點部署集群進行了簡單的評測,每個節點4核15GB RAM。
- 擴展性:使用grep和wordCount兩個實際應用測試,吞吐量隨借點個數增加基本呈線性增長,可擴展性良好。
- 容錯性:使用maxCount和wordCount兩個應用測試,僅需幾秒就能完成錯誤恢復。
?
知識補充
?批量計算 vs. 流式計算:
- 大數據計算模式可分為批量計算和流式計算。
- 批量計算:批量計算首先進行數據的存儲,然后再對存儲的靜態數據進行集中計算。Hadoop是典型的大數據批量計算架構,由HDFS分布式文件系統負責靜態數據的存儲,并通過MapReduce將計算邏輯分配到各數據節點進行數據計算和價值發現。
- 流式計算:流式計算中,無法確定數據的到來時刻和到來順序,也無法將全部數據存儲起來.因此,不再進行流式數據的存儲,而是當流動的數據到來后在內存中直接進行數據的實時計算。
- 流式計算和批量計算分別適用于不同的大數據應用場景。
- 對于先存儲后計算,實時性要求不高,同時,數據的準確性、全面性更為重要的應用場景,批量計算模式更合適;對于無需先存儲,可以直接進行數據計算。
- 實時性要求很嚴格,但數據的精確度要求稍微寬松的應用場景,流式計算具有明顯優勢。
?
?