第1課:通過案例對SparkStreaming 透徹理解三板斧之一

本期內容:
SparkStreaming另類在線實驗
瞬間理解SparkStreaming本質    

一、爲何從Spark Streaming切入Spark源碼定製?
1)Spark最開始沒有其他子框架,只有一個原始的Spark Core.
SparkStreaming本身是Core上的一個框架,透過一個框架的徹底研究肯定可以精通Spark力量的源泉和所有問題的解決之道;
2)Spark SQL 涉及太多的SQL語法細節解析和優化,不適合作爲子框架進行研究;SparkR 很不成熟,支持功能有限;
Spark GraphX最近幾個版本中也無太多改進之處,有很多數學算法;SparkML 也涉及到很多數學知識。綜合我們以SparkStreaming爲切入點。

二、2015年Spark最火爆,大家考慮Spark主要也是因爲Spark Streaming。
(1)流處理的時代:一切數據如果與流式處理不相關的話,都是無效的數據。
(2)Spark之所以強悍的在於,它的流式處理可以在線地使用圖計算、機器學習、SparkSQL或者SparkR的成果,這得益於Spark一體化、多元化的基礎架構設計。也就是在Spark Streaming中可以調用其它任何東西,無需任何設置。這是Spark的無可匹敵之處,也是Spark Streaming定將一統天下的根源。
(3)Spark Streaming的複雜性:整個Spark的程序中,Spark Streaming也是最容易出問題的,因爲數據是不斷地流進,動態控制數據流入、切分、數據處理。
(4)Spark Streaming更像是Spark Core上的一個應用程序。
  
三,另類實戰
小技巧:將BatchInterval設置得足夠大,1分鐘或5分鐘,這樣可以看清數據流入和數據處理各環節。
package com.dt.spark.sparksteaming

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds
/**
 * 使用Scala開發集羣運行的Spark 在線黑名單過濾程序
 * 背景描述:在廣告點擊計費系統中,我們在線過濾掉黑名單的點擊,進而保護廣告商的利益,只進行有效的廣告點擊計費
 * 	或者在防刷評分(或者流量)系統,過濾掉無效的投票或者評分或者流量;
 * 實現技術:使用transform Api直接基於RDD編程,進行join操作 
 */
object OnlineBlackListFilter {
    def main(args: Array[String]){
      /**
       * 第1步:創建Spark的配置對象SparkConf,設置Spark程序的運行時的配置信息,
       * 例如說通過setMaster來設置程序要鏈接的Spark集羣的Master的URL,如果設置
       * 爲local,則代表Spark程序在本地運行,特別適合於機器配置條件非常差(例如
       * 只有1G的內存)的初學者       * 
       */
      val conf = new SparkConf() //創建SparkConf對象
      conf.setAppName("OnlineBlackListFilter") //設置應用程序的名稱,在程序運行的監控界面可以看到名稱
      conf.setMaster("spark://Master:7077") //此時,程序在Spark集羣
         
      val ssc = new StreamingContext(conf, Seconds(300))
      
      /**
       * 黑名單數據準備,實際上黑名單一般都是動態的,例如在Redis或者數據庫中,黑名單的生成往往有複雜的業務
       * 邏輯,具體情況算法不同,但是在Spark Streaming進行處理的時候每次都能工訪問完整的信息
       */
      val blackList = Array(("hadoop", true),("mahout", true))
      val blackListRDD = ssc.sparkContext.parallelize(blackList, 8)
      
      val adsClickStream = ssc.socketTextStream("Master", 9999)
      
      /**
       * 此處模擬的廣告點擊的每條數據的格式爲:time、name
       * 此處map操作的結果是name、(time,name)的格式
       */
      val adsClickStreamFormatted = adsClickStream.map { ads => (ads.split(" ")(1), ads) }
      adsClickStreamFormatted.transform(userClickRDD => {
        //通過leftOuterJoin操作既保留了左側用戶廣告點擊內容的RDD的所有內容,又獲得了相應點擊內容是否在黑名單中
        val joinedBlackListRDD = userClickRDD.leftOuterJoin(blackListRDD)
        
        /**
         * 進行filter過濾的時候,其輸入元素是一個Tuple:(name,((time,name), boolean))
         * 其中第一個元素是黑名單的名稱,第二元素的第二個元素是進行leftOuterJoin的時候是否存在在值
         * 如果存在的話,表面當前廣告點擊是黑名單,需要過濾掉,否則的話則是有效點擊內容;
         */
        val validClicked = joinedBlackListRDD.filter(joinedItem => {
          if(joinedItem._2._2.getOrElse(false))
          {
            false
          } else {
            true
          }
          
        })
        
        validClicked.map(validClick => {validClick._2._1})
      }).print
      
      /**
       * 計算後的有效數據一般都會寫入Kafka中,下游的計費系統會從kafka中pull到有效數據進行計費
       */
      ssc.start()
      ssc.awaitTermination()
      
    }
}
  • 啓動nc -lk 9999,將應用打包發佈至Spark集羣上運行
          
  • SparkStreaming 根據設定的BatchInterval接收處理作業,打印的結果如下:
              
  • 通過master:18080端口查看作業的運行,實質上運行了一個Job,具體如下:
     
         上述Jobs包括1個 Start job、1個running receiver job及3個Print job。

  • Job 0  明細
     
  • Stage 0 明細
     
  •  以下Receiver在整個JOB中耗時 1.5 分鐘
  • JOB 2  DAG圖
        
此時的BlockRDD來自於SocketTextStream,實質是InputDStream根據時間間隔產生RDD
後續DAG圖(略)

四、Spark Streaming 本質

 以上的連續4個圖,分別對應以下4個段落的描述:
       Spark Streaming接收Kafka、Flume、HDFS和Kinesis等各種來源的實時輸入數據,進行處理後,處理結果保存在HDFS、Databases等各種地方。
       Spark Streaming接收這些實時輸入數據流,會將它們按批次劃分,然後交給Spark引擎處理,生成按照批次劃分的結果流。
       Spark Streaming提供了表示連續數據流的、高度抽象的被稱爲離散流的DStream。DStream本質上表示RDD的序列。DStream中的每個RDD都包含來自一個時間間隔的數據。
       Spark Streaming除了使用數據源產生的數據流創建DStream,也可以在已有的DStream上使用一些操作來創建新的DStream。任何對DStream的操作都會轉變爲對底層RDD的操作。本圖例子是對lines Dstream做了flatMap操作,生成words DStream操作。

 在我們前面的實驗中,每300秒會接收一批數據,基於這批數據會生成RDD,進而觸發Job,執行處理。

       DStream是一個沒有邊界的集合,沒有大小的限制。
       DStream代表了時空的概念。隨着時間的推移,裏面不斷產生RDD。
       鎖定到時間片,就是空間的操作,也就是對本時間片的對應批次的數據的處理。

       下面用實例來講解數據處理過程。
       從Spark Streaming程序轉換爲Spark執行的作業的過程中,使用了DStreamGraph。
       Spark Streaming程序中一般會有若干個對DStream的操作。DStreamGraph就是由這些操作的依賴關係構成。
       從程序到DStreamGraph的轉換,如以下圖例所示:

 空間維度確定之後,隨着時間不斷推進,會不斷實例化RDD Graph,然後觸發Job去執行處理。

下面是SparkStreaming的官方說明信息


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