spark streaming 通过maven管理依赖:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.0.2</version>
</dependency>
数据源可能来自以下组件,其Artifact对应关系如下:
Source | Artifact |
---|---|
Kafka | spark-streaming-kafka-0-8_2.11 |
Flume | spark-streaming-flume_2.11 |
Kinesis | spark-streaming-kinesis-asl_2.11 [Amazon Software License] |
创建SparkStreaming程序的一个基本流程
流程看起来是固定的,如下所示:
1.创建SparkConf配置文件,appName参数是应用展示在UI上的标志,master是Spark、Mesos或者YARN集群的URL,本地测试时,可以设置为local[] 表示要创建工作线程的数量。在这里创建的上下文对象,可以通过ssc.sparkContext访问到。
SparkConf conf = new SparkConf().setAppName(appName).setMaster(master);
2.创建StreamingContext上下文对象,Duration是流采集的间隔时长。
JavaStreamingContext ssc = new JavaStreamingContext(conf, new Duration(1000));
我们所需的JavaStreamContent对象,也可以通过SparkContent对象创建得到。
import org.apache.spark.streaming.api.java.*;
JavaSparkContext sc = ... //existing JavaSparkContext
JavaStreamingContext ssc = new JavaStreamingContext(sc, Durations.seconds(1));
3.通过定义DStream来确定数据源。
4.通过使用transformation来定义流计算操作,计算结果生成新的DStream对象。
5.调用streamingContext对象的start方法开始接收处理数据。
6.调用streamingContext的awaitTermination方法,等待处理结束。或者手动调用stop结束数据的处理,但可以出现异常。
DStream
DStream是Spark提供的基本抽象,代表了连续不断的流数据,可以输从输入源采集,也可以是通过transformation变化得到。通常一个DStream是由一系列的RDD组成,RDD是Spark中内容不可变分布数据集。不同的时间采集到的数据装入不同的RDD,组成一个DStream。对DStream进行transformation状态转换操作时,也是对不同的RDD分别进行变化操作。
DStream进行状态转换操作,分为无状态转换和有状态转换。无状态转换,每个批次数据的处理不依赖之前其他批次;而又状态转换,则需要使用之前批次的数据或中间结果。有状态转换分为滑动窗口转换和状态追踪转换(UpdateStateByKey)。
Input DStreams and Receivers
Input DStream代表了从数据流源接收到的输入数据。数据源分为两类,一类是基本数据源和高级数据源。基本的数据源的使用方法已经内置在StreamingContext API中,如文件系统以及Socket连接;高级数据源如Kafka、Flume、Kinesis等等,需要添加管理额外的依赖。
如果我们想接收、并行处理多个数据流,就需要创建多个DStream对象,这将创建多个receiver,并发接收多个数据流。
基本输入源
FileStream
Spark Streaming自动将待处理的文件复制到新的目录,目录中可以有多个文件,但文件格式需要保持一致。文件一旦复制过,源文件再做修改,Spark对修改不生效。
Receiver Reliability
按照可靠性区分,Spark有两种类型的receiver,可靠的接收器和不可靠接收器。可靠接收器通过ack(确认)机制来避免数据丢失导致的故障。
Spark Streaming工作原理
在Spark中,一个应用Application由一个任务控制节点Driver和多个若干作业(Job)组成,一个作业又由多个阶段Stage组成,一个阶段由多个Task组成。