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
時代