包的依賴
初始化StreamingContext
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
sc = SparkContext(master, appName)
ssc = StreamingContext(sc, 1)
context建立之後,需要做以下事情:
- 通過創建輸入離散數據流(DStream)來定義輸入流;
- 通過應用DStream的各種轉換操作和最終的輸出操作來定義流的計算方式;
- 啓動數據流的接收和處理:
streamingContext.start()
. - 等待程序運行被終止:
streamingContext.awaitTermination()
. - 程序可以通過手動方式來結束終止:
streamingContext.stop()
.
需要記住的要點:
- 一旦StreamingContext被啓動,流處理的計算方式不能被修改;
- 一旦StreamingContext被停止,則不能繼續啓動,只能重新啓動;
- 在同一時刻,一個JVM裏只能有一個被啓動的StreamingContext;
- 終止 StreamingContext 同時也終止了關聯的 SparkContext。如果只想終止StreamingContext 而不終止SparkContext,則在調用stop方法時指定可選參數stopSparkContext爲false (默認爲true,停止SparkContext)。StreamingContext.stop(stopSparkContext=True, stopGraceFully=False)
- SparkContext可以被StreamingContexts重用,只要不違反上面提到的約束3 - 在同一時刻一個JVM內只能有一個被啓動的StreamingContext - 則當前一個StreamingContext停止後,就可以啓動下一個StreamingContext。
離散數據流 (DStream)
輸入數據流和接收器
兩類數據源:
- 基本數據源:直接存在在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不支持。
接收器的可靠性
可靠的接收器 - 可靠的接收器能夠在接收並且存儲數據到Spark後,向數據源發送確認消息。要求的前提是這類數據源支持此確認機制;
不可靠的接收器 - 不可靠的接收器不會向數據源進行消息確認,一個可能是數據源本身不支持確認機制,例如Socket數據要換;一個是接收器不想這樣做這麼複雜,例如對數據的丟失可以容忍;