Spark 定製版:001~Spark Streaming(一)

本講內容:

a. Spark Streaming在線另類實驗
b. 瞬間理解Spark Streaming的本質

注:本講內容基於Spark 1.6.1版本(在2016年5月來說是Spark最新版本)講解。

源碼定製爲什麼從Spark Streaming切入?

a. Spark 最初只有Spark Core,通過逐步的發展,擴展出了Spark SQL、Spark Streaming、Spark MLlib(machine learning)、GraphX(graph)、Spark R等。 而Spark Streaming本是Spark Core上的一個子框架,如果我們試着去精通這個子框架,不僅僅能寫出非常複雜的應用程序,還能夠很好的駕馭Spark,進而研究並達到精通Spark的地步,及其尋找到Spark問題的解決之道。

b. 由於Spark SQL涉及到很多SQL語法解析和優化的細節,對於我們集中精力研究Spark有所幹擾。Spark R還不是很成熟,支持功能有限。GraphX最近幾個版本基本沒有改進,裏面有許多數學算法。MLlib也涉及到相當多的數學知識。

c. Spark Streaming的優勢是在於可以結合SparkSQL、圖計算、機器學習,使其功能更加強大。同時,在Spark中Spark Streaming也是最容易出現問題的,因爲它是不斷的運行,內部比較複雜。掌握好Spark Streaming,可以去窺視Spark的一切!

Spark Streaming的什麼魅力在吸引你 ?

a、 Spark Streaming是流式計算

這是一個流處理的時代,一切數據如果不是以流式來處理或者跟流式的處理不相關的話,都將是次數據。我們必將處在一個流的數據處理時代。

b、Spark Streaming之最強“小宇宙”

首先,對源源不斷流進來的數據,能夠迅速響應並立即給出你所要是反饋信息,這不是批處理或者數據挖掘能做到的。

其次,Spark非常強大的地方在於它的流式處理可以在線的利用機器學習、圖計算、Spark SQL或者Spark R的成果,這得益於Spark多元化、一體化的基礎架構設計。也就是說,在Spark技術堆棧中,Spark Streaming可以調用任何的API接口,不需要做任何的設置。這是Spark無可匹敵之處,也是Spark Streaming必將一統天下的根源。

最後、我想說在這個時代,流處理單打獨鬥已經無法滿足我們數據的深層次的應用,所以Spark Streaming必將回合多個Spark子框架,爆發最強的小宇宙,稱霸大數據領域。

c、Spark Streaming是“魅力和複雜”的混合體

走進spark,瞭解了What is Spark ? 你會被它的能力折服,假如你能很好的駕馭Spark、精通 Spark Streaming以及Spark其他子框架,你必將領略Spark的無窮魅力。在Spark的所有程序中,Spark Streaming的應用是最具挑戰性、複雜性的,這樣的程序應用也是最容易出問題的。爲什麼這麼說呢?因爲要對數以萬計的不斷流進來的數據,做各種操作,包括:能動態控制數據的流入、作業的切分、數據的處理等,這些都會帶來極大的複雜性。

d、Spark Streaming獨特之處

其實,Spark Streaming很像是基於Spark Core之上的一個應用程序。不像其他子框架,比如機器學習是把數學算法直接應用在Spark的RDD之上,Spark Streaming更像一般的應用程序那樣,感知流進來的數據並進行相應的處理。很像順其自然的一種感知操作,利用自己獨有的”神經元“來對數據進行各類操作。

至此,如果要做Spark 的定製開發,Spark Streaming則是最強有力的切入點,掌握了Spark Streaming也就開啓了精通Spark的天堂之門。

當然想掌握SparkStreaming,但不去精通Spark Core的話,那是不可能的。Spark Core加Spark Streaming更是雙劍合璧,威力無窮。我們選擇SparkStreaming來入手,等於是找到了關鍵點。如果說,Spark算是當今DT龍脈。那麼Spark Streaming就是龍穴之所在。解答龍穴之謎,進而能窺視Spark之根本。

如何清晰的看到數據的流入、被處理的過程?

使用一個小技巧,通過調節放大Batch Interval的方式,來降低批處理次數,以方便看清楚各個環節。
我們從已寫過的廣告點擊的在線黑名單過濾的Spark Streaming應用程序入手。一下是具體的實驗源碼:

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

案例過程及其分析

a、打包程序,上傳到集羣上

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

b、 集羣中需要先執行nc,啓動 9999端口

nc -lk 9999

這裏寫圖片描述

c、執行shell代碼

sh內容
/usr/local/spark-1.6.1-bin-hadoop2.6/bin/spark-submit –class com.dt.spark.sparkstreaming.OnlineBlackListFilter –master spark://Master:7077 /root/Documents/SparkApps/WordCount.jar

這裏寫圖片描述

我們運行完程序,看到過濾結果以後,停止程序,打開HistoryServer http://master:18080/

這裏寫圖片描述

點擊App ID進去,打開,會看到如下圖所示的4個Job,從實際執行的Job是1個Job,但是圖中顯示有4個Job,從這裏可以看出Spark Streaming運行的時候自己會啓動一些Job。

這裏寫圖片描述

先看看job id 爲0 的詳細信息

這裏寫圖片描述

很明顯是我們定義的blackListRDD數據的生成。對應的代碼爲
val blackList = Array((“Hadoop”, true), (“Mathou”, true))
//把Array變成RDD
val blackListRDD = ssc.sparkContext.parallelize(blackList)
並且它做了reduceBykey的操作(代碼中並沒有此步操作,SparkStreaming框架自行生成的)。
這裏有兩個Stage,Stage 0和Stage 1 。

Job 1的詳細信息

這裏寫圖片描述

一個makeRDD,這個RDD是receiver不斷的接收數據流中的數據,在時間間隔達到batchInterval後,將所有數據變成一個RDD。並且它的耗時也是最長的,59s 。

特別說明:此處可以看出,receiver也是一個獨立的job。由此我們可以得出一個結論:我們在應用程序中,可以啓動多個job,並且不用的job之間可以相互配合,這就爲我們編寫複雜的應用程序打下了基礎。
我們點擊上面的start at OnlineBlackListFilter.scala:64查看詳細信息

這裏寫圖片描述

根據上圖的信息,只有一個Executor在接收數據,最最重要的是紅色框中的數據本地性爲PROCESS_LOCAL,由此可以知道receiver接收到數據後會保存到內存中,只要內存充足是不會寫到磁盤中的。
即便在創建receiver時,指定的存儲默認策略爲MEMORY_AND_DISK_SER_2
def socketTextStream(
hostname: String,
port: Int,
storageLevel: StorageLevel = StorageLevel.MEMORY_AND_DISK_SER_2
): ReceiverInputDStream[String] = withNamedScope(“socket text stream”) {
socketStream[String](hostname, port, SocketReceiver.bytesToLines, storageLevel)
}

job 2的詳細信息

這裏寫圖片描述
這裏寫圖片描述

Job 2 將前兩個job生成的RDD進行leftOuterJoin操作。
從Stage Id的編號就可以看出,它是依賴於上兩個Job的。
Receiver接收數據時是在spark-master節點上,但是Job 2在處理數據時,數據已經到了spark-worker1上了(因爲我的環境只有兩個worker,數據並沒有分散到所有worker節點,worker節點如果多一點,情況可能不一樣,每個節點都會處理數據)
點擊上面的Stage Id 3查看詳細信息:
這裏寫圖片描述
Executor上運行,並且有5個Task 。

Job 3的詳細信息

這裏寫圖片描述
這裏寫圖片描述

總結:我們可以看出,一個batchInterval並不是僅僅觸發一個Job。

根據上面的描述,我們更細緻的瞭解了DStream和RDD的關係了。DStream就是一個個batchInterval時間內的RDD組成的。只不過DStream帶上了時間維度,是一個無邊界的集合。

這裏寫圖片描述

以上的連續4個圖,分別對應以下4個段落的描述:
Spark Streaming接收Kafka、Flume、HDFS和Kinesis等各種來源的實時輸入數據,進行處理後,處理結果保存在HDFS、Databases等各種地方。
Spark Streaming接收這些實時輸入數據流,會將它們按批次劃分,然後交給Spark引擎處理,生成按照批次劃分的結果流。
Spark Streaming提供了表示連續數據流的、高度抽象的被稱爲離散流的DStream。DStream本質上表示RDD的序列。任何對DStream的操作都會轉變爲對底層RDD的操作。
Spark Streaming使用數據源產生的數據流創建DStream,也可以在已有的DStream上使用一些操作來創建新的DStream。
在我們前面的實驗中,每300秒會接收一批數據,基於這批數據會生成RDD,進而觸發Job,執行處理。
DStream是一個沒有邊界的集合,沒有大小的限制。
DStream代表了時空的概念。隨着時間的推移,裏面不斷產生RDD。
鎖定到時間片後,就是空間的操作,也就是對本時間片的對應批次的數據的處理。
下面用實例來講解數據處理過程。
從Spark Streaming程序轉換爲Spark執行的作業的過程中,使用了DStreamGraph。
Spark Streaming程序中一般會有若干個對DStream的操作。DStreamGraph就是由這些操作的依賴關係構成。

對DStream的操作會構建成DStream Graph

這裏寫圖片描述

從每個foreach開始,都會進行回溯。從後往前回溯這些操作之間的依賴關係,也就形成了DStreamGraph。

在每到batchInterval時間間隔後,Job被觸發,DStream Graph將會被轉換成RDD Graph

這裏寫圖片描述

空間維度確定之後,隨着時間不斷推進,會不斷實例化RDD Graph,然後觸發Job去執行處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章