Spark Streaming架構及工作原理

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分鐘內訪問次數最多的用戶
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章