概观
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