1、数据的输入 kafka、flume、hdfs、Socket
2、数据的处理 storm(很少)、SparkStreaming、flink
3、数据的输出 kafka、hbase、redis(codis)、mysql
4、springboot 大屏
===============================================
1、提交任务
2、Driver服务会发送receiver(接收器)对象到Executor上面,receiver
说白了就是用来接收数据的,receiver默认就只有一个,但是我们可以
通过代码设置多个
3、receiver启动起来之后,其实就是一task任务,然后这个任务就不断的接收数据
但是它把接收到的这些数据都封装成一个个block(每200ms之后的数据就是一个block),然后把这些block写到Executor的内存中
4、receiver会把这些blcok的信息高速给Driver
5、Driver会根据一定的时间间隔(初始化时设置的Seconds(2)),把这些block组织成一个rdd(其实一个block就是一个parititon)
然后对这些rdd进行处理
SparkStreaming的运行流程里面:
1、block interval
默认是200s
2、batch interval
val ssc = new StreamingContext(conf,Seconds(2))
由我们的用户自己去控制的,你写了多少就是多少
******************水一篇,SparkStreaming挺好玩的*********************************
憨
实时任务:
1. 数据的输入
1.1 socket (讲课的时候,练习使用,方便)
1.2 HDFS的数据源(这个应用场景不是很多,了解)
1.3 flume(不讲,了解)
1.4 kafka 最最核心的一个数据源,只不过我们现在还不讲,因为非常重要,下一次课
1.5 自定义数据源
用户不是特别的多,有时会用
2. 数据的处理
2.1 updateStateBykey
updateFunc:(Seq[V],Option[S])=>Option[S]
这个常用
2.2 mapWithState
这个算子在官方没有介绍,spark源码里面
kafka:
examples:里面演示的consumer producer如何使用?
spark:
examples:里面演示了一个算子mapWithState
这个算子在spark1.6以后出现,我们可以理解就是对updateStateBykey的优化,
性能要比updateStateBykey要好,好很多倍。所以spark的官方博客推荐使用的是mapWithState
2.3 transform
最大的意义在于可以把DStream =>RDD=>SparkSQL
DStream=>RDD=>DataSet/DataFrame=>Table =>SQL
DStream RDD DataFrame/DataSet 之间可以进行无缝的切换
着啊用哪个的一个架构设计就比较牛了
2.4 window窗口操作
我们现在能解决的问题就是:
a 对当前批次进行处理,统计,计算
b 对历史的结果的进行累积,累加
如果现在有这样的一个需求:
每隔4秒统计一下最近6秒的单词出现的次数
3 数据输出
3.1 测试的时候打印print
3.2 saveAsxxx
基本不会用,不会存储到文件系统里面
3.3 foreachRDD(企业里面就使用这个)
RDD:
transform:
map
mapPartition
action:
foreach
foreachPartition
DStream:
transform操作:
transform(rdd)=》mapPartition
action的操作:
foreachRDD(rdd)=》foreachPartition