========== Spark Streaming 是什麼 ==========
一、SPark Streaming 是 Spark 中一個組件,基於 Spark Core 進行構建,用於對流式進行處理,相似於 Storm。
二、Spark Streaming 可以和 Spark Core、Spark SQL 來進行混合編程。
三、Spark Streaming 咱們主要關注:
(1)Spark Streaming 能接受什麼數據? kafka、flume、HDFS、Twitter 等。
(2)Spark Streaming 能怎麼處理數據? 無狀態的轉換(前面處理的數據和後面處理的數據沒啥關係)、有轉換轉換(前面處理的數據和後面處理的數據是有關係的,好比 疊加關係)。java
========== Spark Streaming 是怎麼實現的 ==========
一、Spark Streaming 採用【微批次】架構。
二、對於整個流式計算來講,數據流能夠想象成水流,微批次架構的意思就是將水流按照用戶設定的時間間隔分割爲多個水流段。一個段的水會在 Spark 中轉換成爲一個 RDD,因此對水流的操做也就是對這些分割後的 RDD 進行單獨的操做。每個 RDD 的操做均可以認爲是一個小的批處理(也就是離線處理)。sql
========== Spark Streaming DStream 是什麼 ==========
一、DStream 是相似於 RDD 和 DataFrame 的針對流式計算的抽象類。在源碼中 DStream 是經過 HashMap 來保存所管理的數據流的。K 是 RDD 中數據流的時間,V 是包含數據流的 RDD。
二、對於 DStream 的操做也就是對於 DStream 所包含的全部以時間序列排序的 RDD 的操做。編程
========== Spark Streaming 怎麼用 ==========
一、經過 StreamingContext 來進入 Spark Streaming。能夠經過已經建立好的 SparkContext 來建立 StreamingContext。
val ssc = new StreamingContext(sc, Seconds(1))bootstrap
========== Spark Streaming 的輸入 ==========
一、 文件數據源
(1)Spark Streaming 經過 streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory)
, 這個方法提供了對目錄下文件數據源的支持。
(2)若是文件是比較簡單的文本文件,可使用 streamingContext.textFileStream(dataDirectory)
來代替。
(3)文件數據源目前不支持嵌套目錄:
1)文件須要有相同的數據格式。
2)文件進入 dataDirectory 的方式須要經過移動或者重命名來實現。
3)一旦文件移動進目錄,則不能再修改,即使修改了也不會再讀取新的數據。ruby
二、自定義的 Receiver
(1)須要新建一個 Class 去繼承 Receiver,並給 Receiver 傳入一個類型參數,該類型參數是須要接收的數據的類型。
(2)須要去複寫 Receiver 的方法: onStart 方法(在 Receiver 啓動的時候調用的方法)、onStop 方法(在 Receiver 正常中止的狀況下調用的方法)。
(3)在程序中經過 streamingContext.receiverStream(new CustomeReceiver) 來調用自定義的 Receiver。架構
三、RDD 數據源
(1)能夠經過 StreamingContext.queueStream(rddQueue)
這個方法來監控一個 RDD 的隊列,全部加入到這個 RDD 隊列中的新的 RDD,都會被 Streaming 去處理。app
四、Spark Streaming 與 Kafka 的集成
(1)啓動 zookeeper 集羣和 kafka 集羣。框架
[atguigu@hadoop102 zookeeper-3.4.10]$ pwd
/opt/module/zookeeper-3.4.10
[atguigu@hadoop102 zookeeper-3.4.10]$ /bin/zkServer.sh start
[atguigu@hadoop103 zookeeper-3.4.10]$ /bin/zkServer.sh start
[atguigu@hadoop104 zookeeper-3.4.10]$ /bin/zkServer.sh start
[atguigu@hadoop102 kafka]$ pwd
/opt/module/kafka
[atguigu@hadoop102 kafka]$ bin/kafka-server-start.sh -daemon ./config/server.properties
[atguigu@hadoop103 kafka]$ bin/kafka-server-start.sh -daemon ./config/server.properties
[atguigu@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon ./config/server.properties
(2)建立兩個 topic,一個爲 source,一個爲 target函數
bin/kafka-topics.sh --create \
--zookeeper 192.168.25.102:2181,192.168.25.103:2181,192.168.25.104:2181 \
--replication-factor 2 \
--partitions 2 \
--topic source
bin/kafka-topics.sh --create \
--zookeeper 192.168.25.102:2181,192.168.25.103:2181,192.168.25.104:2181 \
--replication-factor 2 \
--partitions 2 \
--topic targe
(3)啓動 kafka console producer 寫入 source topicoop
bin/kafka-console-producer.sh \
--broker-list 192.168.25.102:9092,192.168.25.103:9092,192.168.25.104:9092 \
--topic source
(4)啓動 kafka console consumer 監聽 target topic
bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.25.102:9092,192.168.25.103:9092,192.168.25.104:9092 \
--topic target
(5)啓動 kafka Streaming 程序
[atguigu@hadoop102 ~]$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--class com.atguigu.streaming.KafkaStreaming \
/opt/software/sparkjars/kafkastreaming-jar-with-dependencies.jar
========== Spark Streaming 的轉換 ==========
一、這些方法定義在哪兒?
(1)在 DStream 的類定義中,主要提供對於值類型的 DStream 的操做。
(2)在 PairDStreamFunctions 的類定義中,主要提供對於 K-V 對形式的 DStream 的操做。
二、無狀態裝換
三、有狀態裝換
(1)updateStateByKey 函數
def updateStateByKey[S: ClassTag](
updateFunc: (Seq[V], Option[S]) => Option[S]
): DStream[(K, S)] = ssc.withScope {
updateStateByKey(updateFunc, defaultPartitioner())
}
S 表示的是須要保存的狀態的類型。
updateFunc 是定義了每一批次 RDD 如何來更新的狀態值的方法。
Seq[V] 是當前批次相同 key 的值的集合。Option[S] 是框架自動提供的,存儲的是上一次保存的狀態的值。
updateStateByKey 會返回一個新的 DStream,該 DStream 中保存了 (Key,State) 的序列。
(2)window 函數
四、檢查點機制
(1)StreamingContext 是可以從檢查點中恢復數據的,能夠經過 StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext) 來建立。
(2)Streaming 中的累加器和廣播變量是不可以從檢查點中恢復。
========== Spark Streaming 的輸出 ==========
========== Spark Streaming 與 Storm 的比較 ==========
Spark Streaming:
SPark Streaming 用於對流式進行處理,相似於 Storm。
Spark Streaming 絕對談不上比 Storm 優秀。這兩個框架在實時計算領域中,都很優秀,只是擅長的細分場景並不相同。
Spark Streaming 吞吐量高、良好的 spark 的擴展性、和 Spark Core、Spark SQL 無縫整合,實時處理出來的中間數據
Storm 支持事務機制、健壯性 / 容錯性、動態調整並行度等特性。
Storm --> 純實時
Spark Streaming --> 準實時(RDD 轉換)
應用場景:
對於 Storm 來講:
一、純實時 --> 實時金融系統,金融交易和分析。
二、事務機制和可靠性機制。
三、若是還須要針對高峯低峯時間段,動態調整實時計算程序的並行度,以最大限度利用集羣資源(一般是在小型公司,集羣資源緊張的狀況),也能夠考慮用 Storm。
四、不須要在中間執行 SQL 交互式查詢、複雜的 Transformation 算子等,那麼用 Storm 是比較好的選擇。
對於 Spark Streaming 來講: 一、還包括了離線批處理、交互式查詢等業務功能。 二、涉及到高延遲批處理、交互式查詢等功能。