目錄
-
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()