大數據技術之_19_Spark學習_04_Spark Streaming 應用解析小結

========== Spark Streaming 是什麼 ==========
1、SPark Streaming 是 Spark 中一個組件,基於 Spark Core 進行構建,用於對流式進行處理,類似於 Storm。
2、Spark Streaming 能夠和 Spark Core、Spark SQL 來進行混合編程。
3、Spark Streaming 我們主要關注:
  (1)Spark Streaming 能接受什麼數據? kafka、flume、HDFS、Twitter 等。
  (2)Spark Streaming 能怎麼處理數據? 無狀態的轉換(前面處理的數據和後面處理的數據沒啥關係)、有轉換轉換(前面處理的數據和後面處理的數據是有關係的,比如 疊加關係)。

========== Spark Streaming 是怎麼實現的 ==========
1、Spark Streaming 採用【微批次】架構。
2、對於整個流式計算來說,數據流可以想象成水流,微批次架構的意思就是將水流按照用戶設定的時間間隔分割爲多個水流段。一個段的水會在 Spark 中轉換成爲一個 RDD,所以對水流的操作也就是對這些分割後的 RDD 進行單獨的操作。每一個 RDD 的操作都可以認爲是一個小的批處理(也就是離線處理)。

========== Spark Streaming DStream 是什麼 ==========
1、DStream 是類似於 RDD 和 DataFrame 的針對流式計算的抽象類。在源碼中 DStream 是通過 HashMap 來保存所管理的數據流的。K 是 RDD 中數據流的時間,V 是包含數據流的 RDD。
2、對於 DStream 的操作也就是對於 DStream 所包含的所有以時間序列排序的 RDD 的操作。

========== Spark Streaming 怎麼用 ==========
1、通過 StreamingContext 來進入 Spark Streaming。可以通過已經創建好的 SparkContext 來創建 StreamingContext。
val ssc = new StreamingContext(sc, Seconds(1))

========== Spark Streaming 的輸入 ==========
1、 文件數據源
(1)Spark Streaming 通過 streamingContext.fileStream[KeyClass, ValueClass, InputFormatClass](dataDirectory), 這個方法提供了對目錄下文件數據源的支持。
(2)如果文件是比較簡單的文本文件,可以使用 streamingContext.textFileStream(dataDirectory) 來代替。
(3)文件數據源目前不支持嵌套目錄:
  1)文件需要有相同的數據格式。
  2)文件進入 dataDirectory 的方式需要通過移動或者重命名來實現。
  3)一旦文件移動進目錄,則不能再修改,即便修改了也不會再讀取新的數據。

2、自定義的 Receiver
(1)需要新建一個 Class 去繼承 Receiver,並給 Receiver 傳入一個類型參數,該類型參數是需要接收的數據的類型。
(2)需要去複寫 Receiver 的方法: onStart 方法(在 Receiver 啓動的時候調用的方法)、onStop 方法(在 Receiver 正常停止的情況下調用的方法)。
(3)在程序中通過 streamingContext.receiverStream(new CustomeReceiver) 來調用自定義的 Receiver。

3、RDD 數據源
(1)可以通過 StreamingContext.queueStream(rddQueue) 這個方法來監控一個 RDD 的隊列,所有加入到這個 RDD 隊列中的新的 RDD,都會被 Streaming 去處理。

4、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 topic

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、這些方法定義在哪兒?
  (1)在 DStream 的類定義中,主要提供對於值類型的 DStream 的操作。
  (2)在 PairDStreamFunctions 的類定義中,主要提供對於 K-V 對形式的 DStream 的操作。

2、無狀態裝換

3、有狀態裝換
(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 函數

4、檢查點機制
  (1)StreamingContext 是能夠從檢查點中恢復數據的,可以通過 StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext) 來創建。
  (2)Streaming 中的累加器和廣播變量是不能夠從檢查點中恢復。

========== Spark Streaming 的輸出 ==========

我的GitHub地址:https://github.com/heizemingjun
我的博客園地址:https://www.cnblogs.com/chenmingjun
我的CSDN地址:https://blog.csdn.net/u012990179
我的螞蟻筆記博客地址:https://blog.leanote.com/chenmingjun
Copyright ©2018~2019 黑澤君
【轉載文章務必保留出處和署名,謝謝!】

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