MHuiG

「看庭前花开花落,望天上云卷云舒」

Streaming

# SparkStreaming

## 实时任务场景介绍

2014 年的大数据的三剑客

- `Hadoop`: 必须会使用 `Java`

- `Hive`: 大数据中使用最广泛的一个技术 `Sql` => `MapReduce`

- `Storm` : 人性是贪婪的，`Hadoop` 和 `Hive` 都是计算的离线的、历史的数据

后来的大数据的三剑客

- `Spark` : 使用 `SparkCore` 内存计算提高了 `MapReduce` 的计算效率 `Scala`、`Python`、`Java`

- `SparkSQL`: `Sql` => `Spark Core` 任务

- `SparkStreaming`/`Flink`

实时的应用场景：2020 淘宝双 11 成交额 `4892` 亿

实时计算就是来一个订单计算一个订单，每时每刻每秒都在统计

离线计算就是统计某个已经发生的时间段内的数据

- 例：淘宝在年底的时候计算 1.1-12.31 号的所有订单

坐电梯的时候需要凑够一波人坐电梯上去，把每一个人看作一个数据集攒了一定的人数之后一起坐电梯上去，我们会等待一定的时间统一处理数据，这个时候我们处理的就是历史数据了

特点

- 处理的是离线的数据

- 每次处理的数据量比较大

- 处理的时间比较长，比较慢

扶梯

- 1、处理的是实时的数据

- 2、每次处理的数据量不大

- 3、处理的时间比较短、比较快

数据流

- 实时任务处理的就是数据流，数据流其实只是一个形象的说法，指的是任务处理的数据像流水一样源源不断的过来，就像水龙头里面的水一样

## SparkStreaming 程序入口剖析

### SparkCore

核心抽象：`RDD`–`Resiliennt Distributed Datasets`

程序入口：`val sc = new SparkContext(conf)`

算子的操作：`Transformation`/`Action`

### SparkSQL

核心抽象：`DataFrame`/`DataSet`

程序入口：

Spark 1.x：`new SQLContext(conf)`、`new HiveContext(conf)`

Spark 2.x/3.x：`val ss = new SparkSession(conf)`

算子的操作 / SQL

### SparkStreaming

核心抽象：`DStream`

程序入口：

    val conf = new SparkConf().setAppName("SS").setMaster("local[2]")

    val sc = new SparkContext(conf)

    val ssc = new StreamingContext(sc,Seconds(1))

算子操作（RDD 的算子操作在 SparkStreaming 上都可以用）

## DStream 核心抽象深度剖析

1、`SparkStreaming` 的任务是基于 `SparkCore`，然后我们任务启动的时候，或者是初始化的时候都会有一个 Driver 的服务

2、Driver 端会发送 Receivers 到 Worker 里面，Receiver 其实说白了就是一个接收器，接收数据，这个 Receiver 具体就是表现为一个 Task 任务，默认情况下只有一个 Receiver 可以通过配置多个

3、Receiver 会接收数据，并且会把数据生成 block 块（1、生成文件块的依据是啥？）接着就把这些文件块（block）存入到 Executor 的内存里面，为了保证数据安全，默认这些数据是有副本的，在其它的 Executor 上存储副本

4、receiver 会把 block 的信息（元数据的信息）发送给 Driver 端

5、Driver 端会根据一定的时间间隔（2、封装 RDD 时间间隔是多少？）把这些 block 封装成为一个 RDD，然后进行计算

Receiver 把数据合并成 block 块的依据？

每 `200ms` 生成一个 Block `1` 个 `block` 对应 `1` 个 `partition` 对应 `1` 个 `task` 任务

`Driver` 将 `Block` 封装成 `RDD` 的时间间隔是？

根据程序入口中的时间参数，如 `ssc = new StreamingContext(sc,Seconds(1))` 就是每隔 `1`s 中将 `block` 块合封装成一个 `RDD`

`SparkStreaming` 不是真正意义上的实时计算，不是真的来一条数据就处理一条数据；微批处理，只不过间隔较短，每次数据里的数据量不大，然后又比较快，所以我们就把它认为实时处理了！！！准实时处理

时间间隔：

- `Batch interval`

  - 指的就是我们的这个实时任务多久运行一次，这个是我们获取程序入口的时候自己指定的

- `block interval`

  - 默认是 `200` ms

一个一个的 RDD 的流就被 Spark 抽象为 `DStream`

RDD 流 = `DStream`

## 快速上手

引入类库

    import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}

    import org.apache.spark.streaming.{Seconds, StreamingContext}

    import org.apache.spark.{SparkConf, SparkContext}

    import org.apache.log4j.{Level, Logger}

步骤 1：初始化程序入口

步骤 2：通过数据源获取数据（数据输入）

步骤 3：进行算子的操作，实现业务（数据处理）

步骤 4：数据的输出

步骤 5：启动任务

步骤 6：等待任务结束

Spark RDD 编程

RDD Spark RDD 编程 RDD 编程基础RDD 创建从文件系统中加载数据创建 RDDSpark 采用 textFile() 方法来从文件系统中加载数据创建 RDD该方法把文件...

SparkStreaming 整合 Kafka

Streaming & Kafka SparkStreaming 整合 Kafka SparkStreaming 整合 Kafkakafka 的两个重要版本 Kafka-0...

留言区

Notes
Spark
本文目录
Are you Robot?