1 概述
官方网站
Spark Streaming是Spark core API的扩展,支持实时数据流的处理,并且具有可扩展,高吞吐量,容错的特点。 数据可以从许多来源获取,如Kafka,Flume,Kinesis或TCP sockets,并且可以使用复杂的算法进行处理,这些算法使用诸如map,reduce,join和window等高级函数表示。 最后,处理后的数据可以推送到文件系统,数据库等。 实际上,您可以将Spark的机器学习和图形处理算法应用于数据流。
总的来说我们可以从三点进行考虑:输入—–计算—–输出。正如下图所示:
1. 输入:可以从Kafka,Flume,HDFS等获取数据
2. 计算:我们可以通过map,reduce,join等一系列算子通过spark计算引擎进行计算(基本和RDD一样,使用起来更方便。)
3. 输出:可以输出到HDFS,数据库,HBase等。
2 处理数据的特点
在内部,它的工作原理如下。 Spark Streaming接收实时输入数据流并将数据分成批,然后由Spark引擎处理,以批量生成最终结果流。
从图中也能看出它将输入的数据分成多个batch进行处理,严格来说spark streaming 并不是一个真正的实时框架,因为他是分批次进行处理的。
Spark Streaming提供了一个高层抽象,称为discretized stream或DStream,它表示连续的数据流。 DStream可以通过Kafka,Flume和Kinesis等来源的输入数据流创建,也可以通过在其他DStream上应用高级操作来创建。在内部,DStream表示为一系列RDD。
3 wordcount代码演示进行进一步认识
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
object SocketWordCountApp {
def main(args: Array[String]): Unit = {
//创建SparkConf
val conf=new SparkConf().setAppName("SocketWordCountApp").setMaster("local[2]")
//通过conf 得到StreamingContext,底层就是创建了一个SparkContext
val ssc=new StreamingContext(conf,Seconds(5))
//通过socketTextStream创建一个DSteam,可以看出这里返回的是ReceiverInputDStream[T],后面从源码进行分析
val DStream=ssc.socketTextStream("192.168.137.130",9998)
//wc (看看是不是和RDD中的wc一样呢)
DStream.flatMap(x=>x.split(",")).map(x=>(x,1)).reduceByKey(_+_).print()
// 开始计算
ssc.start()
// 等待计算结束
ssc.awaitTermination()
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
我们在通过nc命令像端口9998输入数据;
[hadoop@hadoop ~]$ nc -lp 9998
a,a,a,a,b,b,b
- 1
- 2
- 查看结果
(b,3)
(a,4)
- 1
- 2
4 初始化StreamingContext
要初始化Spark Streaming程序,必须创建一个StreamingContext对象,它是所有Spark Streaming功能的主要入口点。StreamingContext对象也可以从现有的SparkContext对象创建。
val conf = new SparkConf().setAppName(appName).setMaster(master)
val ssc = new StreamingContext(conf, Seconds(1))
- 1
- 2
当一个Context被定义,你必须做以下的事情:
1. 通过定义输入DStream来创建输入源。
2. 通过在DStream上应用转换操作和输出操作来定义流计算。
3. 使用StreamContext.start()开始来接收数据和处理数据。
4. 使用StreamContext.awaitTermination()来等待计算完成(手动或者因错误终止)。
5. 可以StreamContext.stop()来手动停止计算(一般不会停止)。
注意
a.一旦一个StreamingContext被启动,就不能再设置或添加新的流计算。
b.一旦一个StreamingConte