实时任务场景介绍
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))就是每隔1s中将block块合封装成一个RDD
SparkStreaming不是真正意义上的实时计算,不是真的来一条数据就处理一条数据;微批处理,只不过间隔较短,每次数据里的数据量不大,然后又比较快,所以我们就把它认为实时处理了!!!准实时处理
时间间隔:
Batch interval
- 指的就是我们的这个实时任务多久运行一次,这个是我们获取程序入口的时候自己指定的
block interval
- 默认是200ms
一个一个的RDD的流就被Spark抽象为DStream
RDD流 = DStream
快速上手
引入类库
1 | import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream} |
步骤1:初始化程序入口
步骤2:通过数据源获取数据(数据输入)
步骤3:进行算子的操作,实现业务(数据处理)
步骤4:数据的输出
步骤5:启动任务
步骤6:等待任务结束