开发者学堂课程【大数据Spark2020版(知识精讲与实战演练)第五阶段:SparkStreaming 案例_解释说明】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/692/detail/12134
SparkStreaming 案例_解释说明
内容介绍:
一、复盘代码
二、注意点
三、创建 StreamingContext
四、各种算子
一、复盘代码
初始化环境过程中, val sparkConf = new Sparkconf().setAppName("streaming word count" ). setMaster("local[6]")
//在 Sparkcore 中的内存,创建 Sparkcontext 的时候使用
//在创建 streaming context 的时候也要用到 conf,说明S park streaming 是基于 Spark core 的。
有一个细节需要注意,在执行 master 的时候,不能指定一个线程,因为在 Streaming 运行的的候,需要开一个新的线程来去一直监听数据的获得。"local[6]" 的 local 后面不能给 1,至少要给 2。
接下来创建 streamingcontext,Streamingcontext 其实就是 Spark Streaming 的入口相当于 sparkcontext 是 Spark core 的入口一样,它们也都叫做xxcontext。
ssc.sparkContext.setLogLevel( "WARN")
是进行日志的设置。
//socketTexTstream 这个方法用于创建一个 DStream,监听 socket 输入,当做文本来处理。socket 是指用其监听一个 Tcp 端口,Text 是文本的意思,即读出来的内容是字符串(文本),socketTexTstream 方法相当于 sparkcontext.textFile()创建一个 rdd ,两者很类似,都是创建对应的数据集。
//RDD 来自于 Spark Core,Dstream 来自 Spark Streaming,RDD 是一个静态数据集,也叫做分布式弹性数据集,Dstream 的 D 是离散的意思,stream 是流的意思,Dstream 就代表一个离散的流,普通的流一直在流动,永不停歇 Dstream 是一段一段的流,一个部分一个部分的在流。
Dstream 可以理解为是一个流式的 RDD,Dstream 与 RDD 其实是父子关系,Dstream 的流流动的并不是数据,而是 RDD。
Flatmap 作用于 Dstream,Flatmap 就是把每一条数据拆开,按照空格来进行拆分,可以使用 map 进行转换,数据转换成元组的形式,对数据进行词频的统计,这三个算子和 RDD 是完全一样的,按照 RDD 的理解即可。
//数据的处理
//1.把句子拆为单词
val words = lines.flatMap( _.split( regex =”“))
//2.转换单词
val tuples = words.map((_,1))
//3.词频 reduce
val counts = tuples.reduceByKey(_ + _)
Count 是最后一个 Dstream,Dstream 很类似于 rdd,只不过 rdd 是静态的,Rd是是动态的,Print 作用于最后一个 Dstream 的作用是什么?是打印 Dstream 里面的所有内容。
接下来使用 ssc.start() 开启整个流的处理,使用 awaitTermination 等待外部的终止。
二、注意点
1.Spark Streaming 并不是真正的来―条数据处理一条
Dstream 会按照时间来进行排列,把数据拆分成不同的组。Socket Server 会不断产生新的数据,数据产生以后,就把数据交给 Dstream,然后 Dstream 就会按照时间对数据进行分组,Socket Server 的数据是源源不断产生的,它不会对数据进行分组,Dstream 会将 socket Server 的数据进行积攒,形成批次的间隔,积攒成一个批次以后,去生成一个 rdd,它就代表这个时间点里的 rdd,然后数据再过来的时候再去形成 rdd,当然也是按照时间的间隔来进行划分,其他数据以此类推,所以spark streaming 并不是连续的去处理数据,而是按照间隔,把数据划分成一个又一个的 rdd,然后根据 rdd 进行相应处理。
Spark Streaming 的处理机制叫做小批量,英文叫做 mini-batch ,是收集了一定时间的数据后生成 RDD ,后针对 RDD 进行各种转换操作,这个原理提现在如下两个地方。控制台中打印的结果是一个批次一个批次的,统计单词数量也是按照一个批次一个批次的统计。多长时间生成一个 RDD 去统计呢?
由 new StreamingContext(sparkConf,Seconds(1))
这段代码中的第二个参数指定批次生成的时间
2.Spark Streaming 中至少要有两个线程
在使用 spark-submit 启动程序的时候,不能指定一个线程。第一个线程去接收 socket server 传过来的数据,第二个线程用于去运行 rdd。
(1)主线程被阻塞了,等待程序运行
(2)需要开启后台线程获取数据
三、创建 StreamingContext
val conf = new SparkConf( ) .setAppName( appName ) . setMaster(master)
val ssc = jhew StreamingContext(conf, Seconds (1))
。Seconds (1) 就是批次的间隔,每一秒生成一个 RDDStreamingContext 是 Spark Streaming 程序的入口在创建 StreamingContext 的时候,必须要指定两个参数,一个是 SparkConf ,一个是流中生成 RDD 的时间间隔· StreamingContext 提供了如下功能
创建 DStream,可以通过读取 Kafka , 读取 Socket 消息, 读取本地文件等创建一个流,并且作为整个 DAG 中的 InputDStream oRDD 遇到 Action 才会执行,但是 DStream 不是, DStream 只有在 StreamingContext.start() 后才会开始接收数据并处理数据使用 StreamingContext. awaitTermination () 等待处理被终止。使用StreamingContext.stop()来手动的停止处理
·在使用的时候有如下注意点
同一个 Streaming 程序中,只能有一个 StreamingContext
一旦一个 Context 已经启动 (start ), 则不能添加新的数据源**
四、各种算子
·这些算子类似 RDD ,也会生成新的 DStream
·这些算子操作最终会落到每一个 DStream 生成的 RDD 中
dstream.flatMap()操作虽然是在一整个流上运行 flat map,但是 Dstream 这个流是离散的,其中存放的并不是数据,里面并不是数据在流动,而是 RDD 在流动,fight map 并不是作用于一整个流,而是用于流里面的每一个 rdd,就是说对Dstream 调用 flat map,就相当于对流中的每一个 rdd 调用 flat map。
算子:flatMap
释义:lines .flatMap (_.split( "“))
将一个数据一对多的转换为另外的形式,规则通过传入函数指定
算子:map
释义:words . map ( x=>(x,1))
—对一的转换数据
算子:reduceByKey
释义:words . reduceByKey(_ + _)
这个算子需要特别注意,这个聚合并不是针对于整个流,而是针对于某个批次的数据
因为在 dstream 上调用 map, flatmap, reduceByKey 这些算子的时候其实是在每一个 RDD 中调用的所以只能统计当前 RDD 所代表的批次的结果。