1、概述
A.Spark Streaming 是Spark Core 的API的扩展,它是一个支持扩展,高吞吐量、容错的流式处理框架。
B.数据可以从kafka、flume、kinesis、TCP 端口收集,可以被诸如map、reduce、join、window(实时计算特有概念)等高级别函数处理,最后输出到文件系统、数据库或者显示屏上。
C.实际上,你还可以在数据流上应用机器学习(有些公司在做实时的机器学习)和图计算。
问题1:为什么Spark Streaming 可以结合机器学习和图计算,为什么不用Storm呢?
答:Spark 是一个提供一站式解决大数据问题的框架,借助于Dataset和DataFrame,Spark的所有组件可以完美协调。对于Spark Streaming对接机器学习,数据由Spark Streaming 处理后直接交由机器学习框架进行处理即可,若是由Storm完成相应的功能,必然需要先进行数据落地后再交由机器学习框架处理。
2、 Spark Streaming 的工作原理
A. Spark Streaming接收实时数据流,并按照一定时间间隔将连续的数据流拆分成一批批离散的数据集。
B.然后应用诸如map、reduce、join、window等丰富的API进行复杂的数据处理后,交由Spark的引擎进行计算,生成批量结果数据后输出。
注意:Spark Streaming被称为准实时处理系统,它并不是真正意义上的实时处理系统。实时可以使用Flink。
3、DStream
A.Spark Streaming提供一个高级别的抽象,称之为Discretized Stream,简称DStream,它代表一个连续不断的数据流。B.DStreams有两种创建的方式,一是可以从诸如kafka、flume、kinesis、等输入的数据流上创建,而是可以通过在其他DStreams上应用高级操作创建。实际上,DStream代表的是一个RDD的序列。
C.可以使用java、python、scala三种语言编写Spark Streaming应用程序。在python中,有一些api是不同的或者不可用的,我们做了相应的标记。
问题2:Spark Streaming对比Storm。
答:目前应用最广泛的大数据流式处理框架是Storm。
Spark Streaming最低0.5~2秒做一次处理,Storm最低可达0.1s,在实时性和容错性上Storm更佳。借助于RDD,Spark Streaming可以与Spark上所有组件实现无缝对接共享数据,还可以十分方便的kafka、flume等日志收集框架进行集成,同时
Spark Streaming的吞吐量要远远大于Storm,所以在集成性和吞吐量上Spark Streaming优于Storm。
4、一个简单的例子
来快速完成一个Spark Streaming的例子,即让我们来统计一个监听的TCP端口接收到的文本数据中的词频。
首先,为了添加一些其他类中可用的方法在我们的环境中,我们要导入一些Spark Streaming的类和StreamingContext中的一些隐式转换,我们创建了一个带有两个线程的StreamingContext,批处理间隔为1s。
import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._ // not necessary since Spark 1.3
// Create a local StreamingContext with two working thread and batch interval of 1 second.
// The master requires 2 cores to prevent a starvation scenario.
注意:local[n]中n最小值为2,因为每个Receiver占用一个core,至少一个Receiver,Main()占用一个core。core数量不够则只启用Receiver接受数据而不处理数据
val conf = new SparkConf().setMaster("local[2]").