概觀
Spark Streaming是核心Spark API的擴展,可實現實時數據流的可擴展,高吞吐量,容錯流處理。
數據來源:Kafka,Flume,Kinesis或TCP套接字等,
可以使用高級函數進行復雜算法進行處理map
,例如reduce
,join
和window
。
處理後的數據可以推送到文件系統,數據庫等
它的工作原理:
Spark Streaming接收實時輸入數據流並將數據分成批處理,然後由Spark引擎處理以批量生成最終結果流
Spark Streaming提供稱爲離散流或DStream的高級抽象,表示連續的數據流。DStream可以從來自Kafka,Flume和Kinesis等源的輸入數據流創建,也可以通過在其他DStream上應用高級操作來創建。在內部,DStream表示爲一系列 RDD。
案例介紹
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
object StreamDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[2]").setAppName("MyTest")
val ssc = new StreamingContext(conf,Seconds(1))
//創建一個DStream來表示來自TCP源的流數據,指定爲主機名(例如localhost)和端口(例如9999)。
//此linesDStream表示將從數據服務器接收的數據流。DStream中的每條記錄都是一行文本
val lines = ssc.socketTextStream("localhost",9999)
//flatMap是一對多DStream操作,它通過從源DStream中的每個記錄生成多個新記錄來創建新的DStream。在這種情況下,每行將被分成多個單詞,單詞流表示爲wordsDStream。
val words = lines.flatMap(_.split(" "))
val pairs = words.map(word => (word,1))
val wordCount = pairs.reduceByKey(_+_)
wordCount.print()
//Spark Streaming僅設置啓動時將執行的計算,並且尚未啓動實際處理。要在設置完所有轉換後開始處理
ssc.start()
ssc.awaitTermination()
}
}
使用端口發送數據:
nc -lk 9999
查看端口使用情況:
lsof -i:9999