【Spark Streaming】Spark Streaming案例

目錄

WordCount

需求&準備

代碼

updateStateByKey

reduceByKeyAndWindow


  • WordCount

 

  • 需求&準備

1.首先在linux服務器上安裝nc工具,nc是netcat的簡稱,原本是用來設置路由器,我們可以利用它向某個端口發送數據

yum install -y nc

 

 

2.啓動一個服務端並開放9999端口,等一下往這個端口發數據

nc -lk 9999

 

3.發送數據

 

  • 代碼

//創建sparkConf
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("test01")

//創建SparkContext
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")

//創建StreamingContext
var ssc = new StreamingContext(sc, Seconds(5))

//接收數據
val dataDStream: ReceiverInputDStream[String] = ssc.socketTextStream("node01", 9999)

//根據業務邏輯進行計算
val wordCount: DStream[(String, Int)] = dataDStream.flatMap(x => x.split(" ")).map(line => (line, 1)).reduceByKey(_ + _)

//打印數據
wordCount.print()

//開啓計算任務
ssc.start()

//等待關閉任務
ssc.awaitTermination()

問題:每個批次的單詞次數都被正確的統計出來,但是結果不能累加

 

  • updateStateByKey

如果需要累加需要使用updateStateByKey(func)來更新狀態

def main(args: Array[String]): Unit = {
  //創建sparkConf
  val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("test01")

  //創建SparkContext
  val sc = new SparkContext(conf)
  sc.setLogLevel("WARN")

  //創建StreamingContext
  var ssc = new StreamingContext(sc, Seconds(5))

  //設置臨時數據存放位置
  ssc.checkpoint("./tmpCount")

  //接收數據
  val dataDStream: ReceiverInputDStream[String] = ssc.socketTextStream("node01", 9999)

  //根據業務邏輯進行計算
  val wordAndOne: DStream[(String, Int)] = dataDStream.flatMap(x => x.split(" ")).map(line => (line, 1))
  val wordCount: DStream[(String, Int)] = wordAndOne.updateStateByKey(updateFunc)

  //打印數據
  wordCount.print()

  //開啓計算任務
  ssc.start()

  //等待關閉任務
  ssc.awaitTermination()
}

//計算的方法
def updateFunc(currentValues:Seq[Int], historyValue:Option[Int] ):Option[Int] ={
  // currentValues當前值
  // historyValue歷史值
  val result: Int = currentValues.sum + historyValue.getOrElse(0)
  Some(result)
}

 

 

  • reduceByKeyAndWindow

滑動窗口轉換操作的計算過程如下圖所示,我們可以事先設定一個滑動窗口的長度(也就是窗口的持續時間),並且設定滑動窗口的時間間隔(每隔多長時間執行一次計算),比如設置滑動窗口的長度(也就是窗口的持續時間)爲24H,設置滑動窗口的時間間隔(每隔多長時間執行一次計算)爲1H,那麼意思就是:每隔1H計算最近24H的數據

//創建sparkConf
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("test01")

//創建SparkContext
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")

//創建StreamingContext
var ssc = new StreamingContext(sc, Seconds(5))

//設置臨時數據存放位置
ssc.checkpoint("./tmpCount")

//接收數據
val dataDStream: ReceiverInputDStream[String] = ssc.socketTextStream("node01", 9999)

//根據業務邏輯進行計算
val wordAndOne: DStream[(String, Int)] = dataDStream.flatMap(x => x.split(" ")).map(line => (line, 1))

//第一個參數爲需要執行的操作
//第二個參數爲窗口寬度
//第三個參數爲滑動距離
val wordCount: DStream[(String, Int)] = wordAndOne.reduceByKeyAndWindow((x: Int, y: Int) => x + y,Seconds(10),Seconds(5) )

//打印數據
wordCount.print()

//開啓計算任務
ssc.start()

//等待關閉任務
ssc.awaitTermination()

 

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