Spark Streaming編程模型

DStream 的操作流程

DStream 作爲 Spark Streaming 的基礎抽象,它代表持續性的數據流。這些數據流既可以通過外部輸入源來獲取,也可以通過現有的 DStream 的 Transformation 操作來獲得。

在內部實現上,DStream 由一組時間序列上連續的 RDD 來表示。如圖 1 所示,每個 RDD 都包含了自己特定時間間隔內的數據流。

DStream中在時間軸下生成離散的RDD序列
圖 1  DStream中在時間軸下生成離散的RDD序列

如圖 2 所示,對 DStream 中數據的各種操作也是映射到內部的 RDD 上來進行的,可以通過 RDD 的 Transformation 生成新的 DStream。這裏的執行引擎是 Spark。

DStream中的數據操作流程
圖 2  DStream中的數據操作流程

Spark Streaming 使用

作爲構建於 Spark 之上的應用框架,Spark Streaming 承襲了 Spark 的編程風格。本節以 Spark Streaming 官方提供的 WordCount 代碼爲例來介紹 Spark Streaming 的使用方式。

  1. import org.apache.spark._
  2. import org.apache.spark.streaming._
  3. import org.apache.spark.streaming.StreamingContext._
  4.  
  5. //創建一個擁有兩個工作線程,時間片長度爲 1 秒的 StreamContext
  6. //主結點需要 2 核以免飢餓狀態發生
  7.  
  8. val conf = new SparkConf().setMaster(“local[2]”).setAppName(“NetworkWordCount”);
  9. val ssc = new StreamingContext(conf,Seconds(1))
  10. // 創建連接至 hostname:port 的 DStreamCreate,如 localhost:9999
  11. val lines = ssc.socketTextStream(“localhost”,9999)
  12. //把每一行分解爲單詞
  13. val words = lines.flatMap (_.split(“”))
  14.  
  15. import org.apache.spark.streaming.StreamingContext._
  16.  
  17. //計數每一個時間片內的單詞量
  18. val pairs = words.map(word => (word, 1))
  19. val wordCounts = pairs.reduceByKey(_+_)
  20.  
  21. //打印該 DStream 生成的每個 RDD 中的前 10 個單詞
  22. wordCounts.print()
  23. ssc.start() // 啓動計算
  24. ssc.awaitTermination() //等待計算完成

1. 創建 StreamingContext 對象

Spark Streaming 初始化的主要工作是創建 Streaming Context 對象,通過創建函數的參數指明 Master Server,設定應用名稱,指定 Spark Streaming 處理數據的時間間隔等。上述代碼可設定應用的名稱爲 NetworkWordCount,處理數據的時間間隔爲 1 秒。

2. 創建 InputDStream

Spark Streaming 需要指明數據源。該實例指明使用 socketTextStream,也就是以 socket 連接作爲數據源讀取數據。Spark Streaming 支持多種不同的數據源,包括 Kafka、Flume、HDFS/S3、Kinesis、Twitter。

3. 操作 DStream

對於從數據源得到的 DStream,用戶可以對其進行各種操作,該實例所示的操作就是一個典型的 WordCount 執行流程。對於當前時間窗口內從數據源得到的數據,首先進行分割,然後利用 map 和 reduceByKey 方法進行計算,最後使用 print() 方法輸出結果。

4. 啓動 Spark Streaming

之前的所有步驟只是創建了執行流程,程序沒有真正連接上數據源,也沒有對數據進行任何操作,只是設定好了所有的執行計劃,當 ssc.start() 啓動後程序才真正進行所有預期的操作。

DStream 的輸入源

Spark Streaming 的所有操作都是基於流的,而輸入源是這一系列操作的起點。輸入 DStream 和 DStream 接收的流都代表輸入數據流的來源,Spark Streaming 提供了兩種內置數據流來源:基礎來源和高級來源。

1. 基礎來源

基礎來源是在 StreamingContext API 中直接可用的來源,如文件系統、Socket (套接字)等。

前面的例子已經使用了 ssc.socketTextStream() 方法,即通過 TCP 套接字連接,從文本數據中創建一個 DStream。除了套接字之外,StreamingContext 的 API 還提供了從文件和 Akka actors 中創建 DStreams 作爲輸入源的方法。

Spark Streaming 提供了streamingContext.fileStream(dataDirectory) 方法,該方法可以從任何文件系統(如 HDFS、S3、NFS 等)的文件中讀取數據,然後創建一個 DStream。

Spark Streaming 監控 dataDirectory 目錄和在該目錄下的所有文件的創建處理過程。需要注意的是,文件必須是具有相同的數據格式的,已經爲大家精心準備了大數據的系統學習資料,從Linux-Hadoop-spark-......,需要的小夥伴可以點擊創建的文件必須在 dataDirectory 目錄下。對於簡單的文本文件,可以使用一個簡單的方法 StreamingContext.textFileStream(dataDirectory) 來讀取數據。

Spark Streaming 也可以基於自定義 Actors 的流創建 DStream。通過 Akka actors 接收數據流的使用方法是 streamingContext.actorStream(actorProps,actor—name)。

Spark Streaming 使用 streamingContext.queueStream(queueOfRDDs)方法可以創建基於 RDD 隊列的 DStream,每個 RDD 隊列將被視爲 DStream 中的一塊數據流進行加工處理。

2.高級來源

局級來源,如 Kafka、Flume、Kinesis、Twitter 等,可以通過額外的實用工具類來創建。高級來源需要外部 non-Spark 庫的接口,其中一些有複雜的依賴關係(如 Kafka、Flume)。因此通過這些來源創建 DStreams 需要明確其依賴。例如,如果想創建一個使用 Twitter tweets 的數據的 DStream 流,必須按以下步驟來做。

1)在 sbt 或 maven 工程裏添加 spark-streaming-twitter_2.10 依賴。

2)開發:導入 TwitterUtils 包,通過 TwitterUtils.createStream 方法創建一個 DStream。

3)部署:添加所有依賴的 Jar 包,然後部署應用程序。

需要注意的是,這些高級來源一般在 Spark Shell 中不可用,因此基於這些高級來源的應用不能在 Spark Shell 中進行測試。如果必須在 Spark Shell 中使用它們,則需要下載相應的 maven 工程的 Jar 依賴並添加到類路徑中。另外,輸入 DStream 也可以創建自定義的數據源,需要做的就是實現一個用戶定義的接收器。

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