1、Spark Streaming有哪些組件?
2、Micro-Batch Architecture如何理解?
3、Spark Streaming工作原理是什麼?
4、如何進行DStream 操作?
一、簡介
Spark Streaming 是一個對實時數據流進行高通量、容錯處理的流式處理系統,可以對多種數據源(如Kafka、Flume、Twitter、Zero和TCP 套接字)進行類似Map、Reduce和Join等複雜操作,並將結果保存到外部文件系統、數據庫或應用到實時儀表盤。
它是一套框架,是 Spark 核心API的一個擴展,可以實現高吞吐量的,具備容錯機制的實時流數據處理。
支持多種數據源獲取數據:
Spark Streaming 接收Kafka、Flume、HDFS等各種來源的實時輸入數據,進行處理後,處理結構保存在HDFS、
DataBase等各種地方。
Dashboards:圖形監控界面,Spark Streaming可以輸出到前端的監控頁面上。
二、流處理架構
三、Micro-Batch Architecture
Spark 處理的是批量的數據(離線數據),Spark Streaming 實際上處理並不是像Strom一樣來一條處理一條數據,而是對接的外部數據流之後按照時間切分,批處理一個個切分後的文件,和 Spark 處理邏輯是相同的。
Spark Streaming 將接收到的實時流數據,按照一定時間間隔,對數據進行拆分,交給 Spark Engine 引擎,最終得到一批批的結果。
DStream:Spark Streaming 提供了表示連續數據流的、高度抽象的被稱爲離散流的 DStream。
假如外部數據不斷湧入,按照一分鐘切片,每個一分鐘內部的數據是連續的(連續數據流),而一分鐘與一分鐘的切片卻是相互獨立的(離散流)。
- DStream 是 Spark Streaming 特有的數據類型
- Spark 2.3.1 開始延遲1毫秒(之前約100毫秒)
- Each micro-batch is an RDD – can share code between batch and streaming
四、工作原理
4.1 Streaming Context
01
02
03
04
05
06
07
08
09
10
11
12
|
Streaming Context consumes a stream of data in Spark. from pyspark import SparkContext from pyspark.streaming import StreamingContext # Create a local StreamingContext with two working threads and a batch interval of 2 seconds # local[2] – spark executor runs on 2 cores. sc = StreamingContext( SparkContext( "local[2]" , "NetWordCount" ), 2 ) # …. sc.start() |
- JVM中只能激活一個StreamingContext。
- StreamingContext不能在停止後重新啓動,但是可以重新創建。
4.2 DStream
DStream 離散流由一系列連續的RDD組成,每個RDD都包含了確定時間間隔內的數據:
Spark 的 RDD 可以理解爲空間維度,Dstream 的 RDD 理解爲在空間維度上又加了個時間維度。
例如上圖,數據流進切分爲四個分片,內部處理邏輯都是相同的,只是時間維度不同。
01
02
03
04
05
06
07
08
09
10
|
# Create a local StreamingContext with two working threads and a batch interval of 2 seconds sc = StreamingContext( SparkContext( "local[2]" , "NetWordCount" ), 2 ) lines = ssc.socketTextStream( "localhost" , 3333 ) # Create a DStream words = lines.flatMap( lambda line: line.split( " " )) # Split each line into words pairs = words. map ( lambda word: (word, 1 )) # Count each word in each batch wordCounts = pairs.reduceByKey( lambda x, y: x + y) ssc.start() # Start the computation ssc.awaitTermination() # Wait for the computation to terminate |
Spark 與 Spark Streaming 區別:
Spark -> RDD:transformation action + RDD DAG
Spark Streaming -> Dstream:transformation output(它不能讓數據在中間激活,必須保證數據有輸入有輸出) + DStreamGraph
任何對DStream的操作都會轉變爲對底層RDD的操作(通過算子):
總結:將連續的數據持久化,離散化,然後進行批量處理。
- 持久化:接收到的數據暫存。
爲什麼持久化:做容錯的,當數據流出錯了,因爲沒有得到計算,需要把數據從源頭進行回溯,暫存的數據可以進行恢復。
- 離散化:按時間分片,形成處理單元。
分片處理:分批處理。
4.3 Input DStreams & Receivers
- Input DStreams represent the stream of input data received from streaming sources.
- 每個Input DStream(文件流除外)都與 Receiver 接收方對象相關聯,接收方對象從源接收數據並將其存儲在Spark內存中進行處理。
- 可以在相同的 StreamingContext 下創建多個 Input DStreams
五、DStream 操作
1.1 普通的轉換操作:map、flatMap、flter、union、count、join等
1.2 transform(func)操作:允許DStream 上應用任意RDD-to-RDD函數
1.3 updateStateByKey操作:
1.4 窗口轉換操作: 允許你通過滑動窗口對數據進行轉換,如countByWindow、 reduceByKeyAndWindow等,(批處理間隔、窗口間隔和滑動間隔)
2.輸出操作:允許DStream的數據被輸出到外部系統,如數據庫或文件系統,有print()、foreachRDD(func)、saveAsTextFiles()、 saveAsHadoopFiles()等
3.持久化:通過persist()方法將數據流存放在內存中,有利於高效的迭代運算
六、Spark Streaming 架構
Master:記錄Dstream之間的依賴關係或者血緣關係,並負責任務調度以生成新的RDD
Worker:從網絡接收數據,存儲並執行RDD計算
Client:負責向Spark Streaming中灌入數據
調度:按照時間觸發。
Master:維護了DStream Graph這張圖。(不是節點級別的,是任務級別的)
Worker:按照圖去執行。
Worker 裏面有個重要的角色:receiver,接收外部數據流,然後數據流通過 receiver 傳入整個 Spark Streaming 內部( receiver 最終把數據流包裝成 Spark Streaming 能處理的格式)
receiver:接收器,接收不同的數據源,進行鍼對性的獲取,Spark Streaming 也提供了不同的接收器分佈在不同的節點上,每個接收器都是一個特定的進程,每個節點接收一部分作爲輸入。,receiver接受完不馬上做計算,先存儲到它的內部緩存區。因爲Streaming 是按照時間不斷的分片,所以需要等待,一旦定時器到時間了,緩衝區就會把數據轉換成數據塊block(緩衝區的作用:按照用戶定義的時間間隔切割),然後把數據塊放到一個隊列裏面去,然後Block manager從隊列中把數據塊拿出來,把數據塊轉換成一個spark能處理的數據塊。
爲什麼是一個進程?
container -> Executor 所以是一個進程
Spark Streaming 作業提交:
• Network Input Tracker:跟蹤每一個網絡received數據,並且將其映射到相應的input Dstream上
• Job Scheduler:週期性的訪問DStream Graph並生成Spark Job,將其交給Job Manager執行
• Job Manager:獲取任務隊列,並執行Spark任務
Spark Streaming 窗口操作:
• Spark 提供了一組窗口操作,通過滑動窗口技術對大規模數據的增量更新進行統計分析
• Window Operation:定時進行一定時間段內的數據處理
任何基於窗口操作需要指定兩個參數:
- 窗口總長度(window length):你想計算多長時間的數據
- 滑動時間間隔(slide interval):你每多長時間去更新一次
七、Key Points for InputStream
When running Spark-Streaming program locally, always use
“local[n]” as the master URL, where n > number of
receivers;
When running on a cluster, the number of cores allocated to
the Spark Streaming application must be more than the
number of receivers.
八、Sources of Spark Streaming
- Spark StreamingContext has the following built-in Support for creating
Streaming Sources:
1
2
3
4
5
6
|
def textFileStream(directory: String): DStream[String] Process files in directory – hdfs: / / namenode: 8020 / logs / def socketTextStream(hostname: String, port: Int , storageLevel: StorageLevel StorageLevel.MEMORY_AND_DISK_SER_2): ReceiverInputDStream[String] Create an input stream from a TCP source |
- Flume Sink for Spark Streaming
1
|
val ds = FlumeUtils.createPollingStream(streamCtx, [sink hostname], [sink port]); |
- Kafka Consumer for Spark Streaming
1
|
val ds = KafkaUtils.createStream(streamCtx, zooKeeper, consumerGrp, topicMap); |
九、Spark Streaming 能做什麼
目前而言SparkStreaming 主要支持以下三種業務場景
1、無狀態操作:只關注當前批次中的實時數據,例如:
- 商機標題分類,分類http請求端 -> kafka -> Spark Streaming -> http請求端Map -> 響應結果
- 網庫Nginx訪問日誌收集,flume->kafka -> Spark Streaming -> hive/hdfs
- 數據同步,網庫主站數據通過“主站”->kafka->Spark Streaming -> hive/hdfs
2、有狀態操作:對有狀態的DStream進行操作時,需要依賴之前的數據 除了當前新生成的小批次數據,但還需要用到以前所生成的所有的歷史數據。新生成的數據與歷史數據合併成一份流水錶的全量數據例如:
- 實時統計網庫各個站點總的訪問量
- 實時統計網庫每個商品的總瀏覽量,交易量,交易額
3、窗口操作:定時對指定時間段範圍內的DStream數據進行操作,例如:
- 網庫主站的惡意訪問、爬蟲,每10分鐘統計30分鐘內訪問次數最多的用戶