核心概念:
(1) StreamingConext
通过StreamingContext可以做定义输入源等事情。
- StreamingContext启动后不能重启
- 一个StreamingContext只能存活在一个JVM中
- 一个SparkContext可以用来创建多个StreamingContext
(2) DStream(Discretiezed Streams)
SparkStreaming 基础抽象:持续数据流, DStream代表这持续不断的RDD
DStream的操作底层是针对RDD的操作
(3) Input Dstream and Receivers
除了文件系统,每一个Input Dstream 都需要关联一个Receivers,Receivers接收并存储
(4) Transformations : 转化DStream
(5) Input DStreams Output Operations
实战案例:
案例1: Spark Streaming 处理socket数据
object NetworkWordCount {
def main(args:Array[String]) :Unit = {
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("App");
val ssc = new StreamingContext(sparkConf, Seconds(5))
val lines = ssc.socketTextStream("localhost",6789)
val result = lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
result.print()
ssc.start()
ssc.awaitTermination()
}}
填坑:netcat 控制台:nc -lp 6789
不能写local[1]的原因:
报错:spark.master should be set as local[n], n > 1 in local mode if you have receivers to get data, otherwise Spark jobs will not get resources to process the received data.
案例2:Spark Streaming处理HDFS文件数据
object FileWordCount {
def main(args:Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("FileWordCount");
val ssc = new StreamingContext(sparkConf, Seconds(15))
val lines = ssc.textFileStream("C://TEST/")
lines.print()
lines == null
val result = lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
result.print()
ssc.start()
ssc.awaitTermination()
}}
以windows例:
注意:必须以流方式写入数据才能被检测到
文件需要是同一个格式,且不能有嵌套目录
处理过后的文件不会再被处理