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]") |
算子操作(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} |
步骤 1:初始化程序入口
步骤 2:通过数据源获取数据(数据输入)
步骤 3:进行算子的操作,实现业务(数据处理)
步骤 4:数据的输出
步骤 5:启动任务
步骤 6:等待任务结束