<<Spark Streaming Programming Guide>> - Part 2 基本概念


包的依賴

比較簡單,有時間再翻譯,先作爲placeholder


初始化StreamingContext

StreamingContext通過SparkContext來創建。

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

sc = SparkContext(master, appName)
ssc = StreamingContext(sc, 1)

其中appName指定了Spark程序的名字,在運行多個程序的Spark集羣中會用來標識區分不同的程序;master參數指定Spark cluster的Master地址,根據使用不同的集羣管理器 (standalone, YARN, Mesos) 會有不同的地址格式,另外還有一個特殊格式local[N]來指定本地模式(非集羣模式),N用來指定線程個數,也是最多允許task的併發數目,另外可以使用特殊格式local[*]讓Spark自動選擇,它會探測的CPU的內核數(core)來用作N的值. 在實際的集羣部署中,master參數都不會寫死在代碼裏或者配置文件裏,最方便的方式就是在通過spark-submit在提交程序到集羣的時候通過--master參數運行時指定。

批處理的間隔在如上的例子裏設置爲1,單位爲秒。具體值的設置取決於業務自身的需求,可用的集羣資源,以及程序實際的處理能力。

context建立之後,需要做以下事情:

  • 通過創建輸入離散數據流(DStream)來定義輸入流;
  • 通過應用DStream的各種轉換操作和最終的輸出操作來定義流的計算方式;
  • 啓動數據流的接收和處理: streamingContext.start().
  • 等待程序運行被終止: streamingContext.awaitTermination().
  • 程序可以通過手動方式來結束終止: streamingContext.stop().

需要記住的要點:

  1. 一旦StreamingContext被啓動,流處理的計算方式不能被修改;
  2. 一旦StreamingContext被停止,則不能繼續啓動,只能重新啓動;
  3. 在同一時刻,一個JVM裏只能有一個被啓動的StreamingContext
  4. 終止 StreamingContext 同時也終止了關聯的 SparkContext。如果只想終止StreamingContext 而不終止SparkContext,則在調用stop方法時指定可選參數stopSparkContext爲false (默認爲true,停止SparkContext)。StreamingContext.stop(stopSparkContext=True, stopGraceFully=False)
  5. SparkContext可以被StreamingContexts重用,只要不違反上面提到的約束3 - 在同一時刻一個JVM內只能有一個被啓動的StreamingContext - 則當前一個StreamingContext停止後,就可以啓動下一個StreamingContext。


離散數據流 (DStream)

離散數據流是Spark Streaming提出的一個抽象概念,用來代表持續的數據流,數據流或者從數據源獲得如kafka,或者通過其他的DStream轉換而來。在內部,DStream實際是一組連續的RDD(RDD的解釋具體參照Spark核心包),每一個RDD包含的是數據流在一定時間間隔的數據,如下圖所示 -
Spark Streaming

所有對DStream的操作實際是對內在的RDD的操作。例如在綜述中的wordCount例子中將句子轉換爲單詞的flatMap操作,會作用到每一個時間間隔對應的RDD上,如下如所示。

Spark Streaming
還是Spark的核心引擎對RDD進行轉換操作,DStream操作只是在上面封裝了一下,從而掩蓋了大多數RDD操作的細節,對外暴漏出的是更高層易用的接口。具體的操作會在後面詳述。



輸入數據流和接收器

每一種輸入數據流(除了文件流以外),都包含一個接收器(Receiver),接收器負責從數據源接收收據然後存儲在Spark中。
兩類數據源:
  • 基本數據源:直接存在在Spark Streaming的類庫中,包括文件流和Socket流;
  • 高級數據源:例如Kafka,Flume和Kinesis需要依賴外部的工具類。所以需要加入額外的依賴引入到工程中,例如pom中的dependency。

基本數據源

基本數據源除了從TCP Socket監聽的文本數據流外,還可以把文件作爲輸入源。
文件數據流

可以從任何兼容HDFS API的文件系統目錄中讀取數據(也就是HDFS, S3, NFS), 可以通過以下方式創建DStream -

 streamingContext.textFileStream(dataDirectory)
Spark Streaming會監控目錄dataDirectory,然後處理任何在此目錄下創建的文件 (不支持遞歸的處理子目錄),注意
- 文件必須具有相同格式
- 文件必須一次改名或者移動到此目錄下。
- 一旦文件移動到此目錄後,後續對文件內容的修改不能被監聽到。對於簡單的文本文件,不需要創建receive接收器,所以不需要分配額外的內核。


基於定製化的接收器(Receiver)

可以自己實現接收器來創建DStream。


RDD隊列作爲Stream: 

爲了方便測試,可以基於RDD隊列來創建DStream,使用streamingContext.queueStream(queueOfRDDs)。每一個加入隊列的RDD被作爲DSream中的一次批處理需要處理的數據。


高級數據源

Spark 2.0的Python API中可以使用了Kafka,Keneis 和 Flume的數據源。
這列數據源需要第三方的類庫支持,例如kafak和Flume有着比較複雜的依賴。因此,爲了減少依賴之間的版本衝突,因此把從這類數據源創建DStream的功能被移到了單獨的類庫中,只有當需要的時候才把它引入到工程的依賴中。



定製數據源

Python API不支持。


接收器的可靠性

根據可靠性可以分爲兩類數據源,一類如Kafka和Flume支持消息確認的數據源,因此當接收器接受到消息後可以向數據源進行數據的確認,這樣可以保證沒有數據的丟失。兩類數據源 -
可靠的接收器 - 可靠的接收器能夠在接收並且存儲數據到Spark後,向數據源發送確認消息。要求的前提是這類數據源支持此確認機制;
不可靠的接收器 -  不可靠的接收器不會向數據源進行消息確認,一個可能是數據源本身不支持確認機制,例如Socket數據要換;一個是接收器不想這樣做這麼複雜,例如對數據的丟失可以容忍;




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