Spark Streaming
Spark Streaming 介紹
批量計算
流計算
Spark Streaming 入門
Netcat
的使用
專案例項
目標:使用 Spark Streaming
程式和 Socket server
進行互動, 從 Server
處獲取實時傳輸過來的字串, 拆開單詞並統計單詞數量, 最後列印出來每一個小批次的單詞數量
步驟:
package cn.itcast.streaming import org.apache.spark.SparkConf import org.apache.spark.storage.StorageLevel import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream} import org.apache.spark.streaming.{Seconds, StreamingContext} object StreamingWordCount { def main(args: Array[String]): Unit = { //1.初始化 val sparkConf=new SparkConf().setAppName("streaming").setMaster("local[2]") val ssc=new StreamingContext(sparkConf,Seconds(5)) ssc.sparkContext.setLogLevel("WARN") val lines: ReceiverInputDStream[String] = ssc.socketTextStream( hostname = "192.168.31.101", port = 9999, storageLevel = StorageLevel.MEMORY_AND_DISK_SER ) //2.資料處理 //2.1把句子拆單詞 val words: DStream[String] =lines.flatMap(_.split(" ")) val tuples: DStream[(String, Int)] =words.map((_,1)) val counts: DStream[(String, Int)] =tuples.reduceByKey(_+_) //3.展示 counts.print() ssc.start() ssc.awaitTermination() } }
開始進行互動:
注意:
Spark Streaming
並不是真正的來一條資料處理一條
Spark Streaming
的處理機制叫做小批量, 英文叫做 mini-batch
, 是收集了一定時間的資料後生成 RDD
, 後針對 RDD
進行各種轉換操作, 這個原理提現在如下兩個地方
- 控制檯中列印的結果是一個批次一個批次的, 統計單詞數量也是按照一個批次一個批次的統計
- 多長時間生成一個
RDD
去統計呢? 由new StreamingContext(sparkConf, Seconds(1))
這段程式碼中的第二個引數指定批次生成的時間
Spark Streaming
中至少要有兩個執行緒
在使用 spark-submit
啟動程式的時候, 不能指定一個執行緒
- 主執行緒被阻塞了, 等待程式執行
- 需要開啟後臺執行緒獲取資料
各種運算元
-
這些運算元類似
RDD
, 也會生成新的DStream
-
這些運算元操作最終會落到每一個
DStream
生成的RDD
中
運算元 | 釋義 |
---|---|
|
將一個資料一對多的轉換為另外的形式, 規則通過傳入函式指定 |
|
一對一的轉換資料 |
|
這個運算元需要特別注意, 這個聚合並不是針對於整個流, 而是針對於某個批次的資料 |
Structured Streaming
Spark 程式設計模型的進化過程
程式設計模型 | 解釋 |
---|---|
|
|
|
|
|
|
Spark Streaming 和 Structured Streaming
Spark Streaming
時代
Structured Streaming
時代