## 1、sparkStreaming概述

### 1.1 SparkStreaming是什么

- 它是一个可扩展，高吞吐具有容错性的流式计算框架

  吞吐量：单位时间内成功传输数据的数量

之前我们接触的spark-core和spark-sql都是处理属于离线批处理任务，数据一般都是在那里的，通常我们写好一个脚本，每天定时去处理数据，计算，保存数据结果。这类任务通常是T+1(一天一个任务)，对实时性要求不高。

![ss1](pics/ss1.png)

但在企业中存在很多实时性处理的需求，例如：双十一的京东阿里，通常会做一个实时的数据大屏，显示实时订单。这种情况下，对数据实时性要求较高，仅仅能够容忍到延迟1分钟或几秒钟。

![ss2](pics/ss2.png)

**实时计算框架对比**

Storm

- 流式计算框架
- 以record为单位处理数据
- 也支持micro-batch方式（Trident）

Spark

- 批处理计算框架
- 以RDD为单位处理数据
- 也支持micro-batch流式处理数据（Spark Streaming）

对比：

- 吞吐量：Spark Streaming优于Storm
- 延迟：Spark Streaming差于Storm

### 1.2 Spark Streaming的组件

- Streaming Context：在Spark Context中申请的资源上进行计算的抽象类
- Dstream（离散流）：计算过程中的数据结构，类似RDD

![ss3](pics/ss3.png)

1，Receiver：用于接收数据

2，数据源：基本源、高级源

基本源：

- TCP/IP Socket
- FileSystem
- Akka

高级源（需要额外的类）

- Kafka
- Flume

3，可靠性

4，Dstream的操作

5，缓存

6，Checkpoint

Spark Streaming在运算过程中如何保证数据不丢失：副本、缓存、检查点

**Streaming Context**

- Spark Streaming程序入口

  ![ss4](pics/ss4.png)

- 一旦一个context已经启动，就不能有新的流算子建立或者是添加到context中。
- 一旦一个context已经停止，它就不能再重新启动
- 在JVM中，同一时间只能有一个StreamingContext处于活跃状态
- 在StreamingContext上调用stop()方法，也会关闭SparkContext对象。如果只想关闭StreamingContext对象，设置stop()的可选参数为false
- 一个SparkContext对象可以重复利用去创建多个StreamingContext对象，前提条件是前面的StreamingContext在后面StreamingContext创建之前关闭（不关闭SparkContext）

**DSteam**

- 代表一个连续的数据流
- 在内部，DStream由一系列连续的RDD组成
- DStreams中的每个RDD都包含确定时间间隔内的数据
- 任何对DStreams的操作都转换成了对DStreams隐含的RDD的操作

![ss5](pics/ss5.png)

通常情况下一个DStream对应一个Receiver

![ss6](pics/ss6.png)

![ss7](pics/ss7.png)

**CheckPoint**

- streamingContext.checkpoint(checkpointDirectory)

  StreamingContext的检查点是设置检查点目录

- dstream.checkpoint：设置检查点的时间间隔，设置checkpoint间隔是DStream的滑动间隔的5-10倍

  ![ss12](pics/ss12.png)


