透過案例對SparkStreaming透徹理解三板斧之二
Spark Streaming執行時與其說是Spark Core上的一個流式處理框架,不如說是Spark Core上的一個最複雜的應用程式。如果可以掌握Spark streaming這個複雜的應用程式,那麼其他的再複雜的應用程式都不在話下了。
我們知道Spark Core處理的每一步都是基於RDD的,RDD之間有依賴關係。上圖中的RDD的DAG顯示的是有3個Action,會觸發3個job,RDD自下向上依賴,RDD產生job就會具體的執行。從DSteam Graph中可以看到,DStream的邏輯與RDD基本一致,它就是在RDD的基礎上加上了時間的依賴。RDD的DAG又可以叫空間維度,也就是說整個Spark Streaming多了一個時間維度,也可以成為時空維度。
從這個角度來講,可以將Spark Streaming放在座標系中。其中Y軸就是對RDD的操作,RDD的依賴關係構成了整個job的邏輯,而X軸就是時間。隨著時間的流逝,固定的時間間隔(Batch Interval)就會生成一個job例項,進而在叢集中執行。
對於Spark Streaming來說,當不同的資料來源的資料流進來的時候,基於固定的時間間隔,會形成一系列固定不變的資料集或event集合(例如來自flume和kafka)。而這正好與RDD基於固定的資料集不謀而合,事實上,由DStream基於固定的時間間隔行程的RDD Graph正是基於某一個batch的資料集的。
從上圖中可以看出,在每一個batch上,空間維度的RDD依賴關係都是一樣的,不同的是這個五個batch流入的資料規模和內容不一樣,所以說生成的是不同的RDD依賴關係的例項,所以說RDD的Graph脫胎於DStream的Graph,也就是說DStream就是RDD的模版,不同的時間間隔,生成不同的RDD Graph例項。
從Spark Streaming本身出發:
1.需要RDD DAG的生成模版:DStream Graph
2需要基於Timeline的job控制器
3需要inputStreamings和outputStreamings,代表資料的輸入和輸出
4具體的job執行在Spark Cluster之上,由於streaming不管叢集是否可以消化掉,此時系統容錯就至關重要
5事務處理,我們希望流進來的資料一定會被處理,而且只處理一次。在處理出現崩潰的情況下如何保證Exactly once的事務語意。
從原始碼解讀DStream
從這裡可以看出,DStream就是Spark Streaming的核心,就想Spark Core的核心是RDD,它也有dependency和compute。更為關鍵的是下面的程式碼:
這是一個HashMap,以時間為key,以RDD為value,這也正應證了隨著時間流逝,不斷的生成RDD,產生依賴關係的job,並透過jobScheduler在叢集上執行。再次驗證了DStream就是RDD的模版。
DStream可以說是邏輯級別的,RDD就是物理級別的,DStream所表達的最終都是透過RDD的轉化實現的。前者是更高階別的抽象,後者是底層的實現。DStream實際上就是在時間維度上對RDD集合的封裝,DStream與RDD的關係就是隨著時間流逝不斷的產生RDD,對DStream的操作就是在固定時間上操作RDD。
總結:
在空間維度上的業務邏輯作用於DStream,隨著時間的流逝,每個Batch Interval形成了具體的資料集,產生了RDD,對RDD進行transform操作,進而形成了RDD的依賴關係RDD DAG,形成job。然後jobScheduler根據時間排程,基於RDD的依賴關係,把作業釋出到Spark Cluster上去執行,不斷的產生Spark作業。
備註:
資料來源於:DT_大資料夢工廠(Spark發行版本定製)
作者:陽光男孩spark
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2818896/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 透徹理解輾轉相除法
- 透過案例理解 MQTT 主題與萬用字元MQQT字元
- 高併發,你真的理解透徹了嗎?
- 透徹理解Java併發的等待佇列——ConditionJava佇列
- 透過重構來加深理解——DDD
- 透過原始碼理解Rarp協議原始碼協議
- 透過Python指令碼理解系統程式Python指令碼
- 透徹理解C++11新特性:右值引用、std::move、std::forwardC++Forward
- 透過 Chrome 深入理解瀏覽器導航過程Chrome瀏覽器
- 透過反射對比兩個物件是否相等反射物件
- 學併發程式設計,透徹理解這三個核心是關鍵程式設計
- 『chisel』透過最小專案理解 Chisel 專案結構
- 透過一個具體的例子理解 npm 的 peerDependencyNPM
- 透過 Pulsar 原始碼徹底解決重複消費問題原始碼
- Maven optional關鍵字透徹圖解Maven圖解
- 深入理解 Java 虛擬機器:Java 記憶體區域透徹分析Java虛擬機記憶體
- 深入理解Java虛擬機器-Java記憶體區域透徹分析Java虛擬機記憶體
- 那些你不知道的Dart細節之帶你透徹理解非同步Dart非同步
- 43_初識搜尋引擎_什麼是mapping再次回爐透徹理解APP
- 透過lombok帶你讀透Builder構建器LombokUI
- 看板管理解析:如何透過看板提升專案管理效率?專案管理
- 透過現實生活中一個例子來理解 JavaScript PromiseJavaScriptPromise
- 透過Docker啟動Solace,並在Spring Boot透過JMS整合SolaceDockerSpring Boot
- 透徹,分散式事務一網打盡分散式
- Mysql透過workbench對錶進行匯出匯入MySql
- 透過一個示例形象地理解C# async await非同步C#AI非同步
- 深入JVM,帶你快速、透徹理解G1回收的原理和實現!JVM
- Strava:透過社交功能盈利
- 透過 Helm Chart 部署 Easysearch
- 透過vconfig命令配置VLAN
- 滲透Hacking Team過程
- 透過 Cucumber 學習 BDD
- 【Python】透過Cython提升效能Python
- 透過vscode寫部落格VSCode
- 透過API訪問HDFSAPI
- PHP透過DOM操作XMLPHPXML
- 透過 CancellationToken 提高 Web 效能Web
- 透過案例學調優之--和 SHARED POOL 相關的主要 Latch