基于Spark core API 的一个扩展,处理实时数据流
Spark Core 模型是RDD SparkContext
Spark SQL 模型是DF/DS SparkSession
Spark Streaming 模型是DStream StreamingContext
处理实时数据流过程
Spark Streaming
input(Flume、Kafka、Socket) --> compute(基于core之上的一些算子) --> output(filesystem、hbase、sql、nosql)
Spark Streaming on ML and gragh processing algorithms,体现了spark一站式解决方案的特性
1、在内部,它的工作原理如下。 Spark Streaming接收实时输入数据流并将数据分成批,然后由Spark引擎处理,以批量生成最终结果流。
数据流进来先离散化,分成多个batch,然后持久化存两份,一个在executor一份存内存,然后对每个batch进行批处理
SparkStreaming定义
在定义上下文之后,您必须执行以下操作。
- 通过创建输入DStream来定义输入源。
- 通过将转换和输出操作应用于DStream来定义流式计算。
- 开始接收数据并使用streamingContext.start()处理它。
- 等待使用streamingContext.awaitTermination()停止处理(手动或由于任何错误)。
- 可以使用streamingContext.stop()手动停止处理
SparkStreaming要点
- 一旦Context已经启动,就不能建立或添加新的流式计算。
- 一旦Context被停止,它就不能被重新启动。
- 同时只有一个StreamingContext可以在JVM中处于活动状态。
- StreamingContext上的stop()也会停止SparkContext。 要仅停止StreamingContext,请将stop()的可选参数stopSparkContext设置为false。
- 只要先前的StreamingContext在创建下一个StreamingContext之前停止(不停止SparkContext),就可以重新使用SparkContext来创建多个StreamingContext。
Discretized Streams (DStreams)
DStream是Spark Streaming提供的基本抽象,它表示连续的数据流,即从源接收的输入数据流或通过转换输入流生成的已处理数据流。在内部,DStream由连续的RDD系列表示,DStream中的每个RDD都包含来自特定时间间隔的数据,如下图所示。(下图将一个DStream拆分成4个RDD)
SparkStreaming测试
SparkStreaming支持三种socket通信:socketTextStream socketStream rawSocketTextStream
import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, StreamingContext} object SocketWordCountApp { def main(args: Array[String]){ val sparkConf = new SparkConf().setAppName("SocketWordCountApp").setMaster("local[2]") val ssc = new StreamingContext(sparkConf,Seconds(10)) val lines = ssc.socketTextStream("hadoop",9999) lines.flatMap(_.split(",")).map((_,1)).reduceByKey(_+_).print ssc.start() ssc.awaitTermination() } }
划重点:运行一个有reciver的SparkStreaming任务,至少要分配两个core,一个用于reciver,一个用于处理数据