00:00
好了,同学们,我们接下来呢,把咱们SPA streaming呢做一个简单的总结,也是把咱们课件呢再做一下梳理啊,嗯,东西不多啊,咱们之前讲了很多的原理,包括一些功能实现呢,啊这个同学们下来呢自己看一看,嗯,因为毕竟啊,它是基于Spark啊,它底层呢还是RDD,这个你搞明白,其实其他的还是比较容易的,那好,那我们接下来呢,就再看一看吧,首先第一个Spark streaming它是什么?那么10SPA史streaming呢,是用于流式数据处理的一个18个模块啊,我们把它称之为什么呢?叫准实时V批次的数据处理框架,大家还有印象吗?诶,他又体现了它的概念,这个呢,我们在之前专门给大家讲了一些概念,让大家理解一下,这个只要你不理解错,我觉得就可以了啊来接着往下,往下面的特点咱们就不再说了啊,咱们接着往下它的架构原理图,其中有个非常关键的叫接收器,这个接收器是用来采集数据的,那么所以采集数据它会有一个周期的概念,比方说多长时间采集一回,多长时间采集一回,对吧,你要是一个数据来,一个数据来就采集,那这样的话就是我们真正的流失数据了啊,但是我们说这个不行,10SPARK做不到,因为它的核心底层的还是RDD,它会有那个任务的概念,会有分布式计算的概念,那么在这种情况下,你来一条我出一条,来一条出一条就有点浪费资源了。
01:29
所以它的这个采集器,它是按我们的采集周期,比方说三秒钟五秒钟来采集数据的,而且是一个长期运行的任务啊,恰恰是因为长期运行的任务会让我们的代码的写法发生改变,对吧?这个咱们给大家演示了啊,而且呢,当它采集完数据以后,会发给咱们的驱动器程序,而咱们的驱动器这边的环境就有了一些变化,叫做steming contest啊,它会有一个采集周期的概念,它的底层包含了咱们的10SPA contest 18的核心环境对象,然后呢,再把咱们接收到的数据给它划分阶段,切分任务,然后调度执行,不就整个跟咱们之前学的就大同小异了吗?所以啊,在我看来,SPASTEM就是把数据源发生了改变,它的底层还是什么RD,对吧?
02:21
好,后面呢,有个叫被压机制,那么所谓的被压机制呢,就是让我们的采集速率和咱们消费的速率呢,稍微均衡一些,可以动态调整,而不要固定些死了,对吧,否则会产生一些意想不到的问题,那接下来是我们stream啊,这个d stream呢是一个叫离散化流,它表述的是不连续的数据流,因为你又采集周期的这种概念的话,所以说一段啊,我们的数据封装成一个我们的stream,另外的一段又分装成另外一个stream,他们之间其实是有间隔的啊,然后呢,我们给大家演示这个stream的时候,我们首先演示的就是work count啊,从指定的端口来获取数据,来实现咱们的word count,这个呢我们就不再细说了啊,咱们这两天一直在写这个事情,嗯,然后呢,我们接着往下,下面呢是咱们的原理,咱们的stream就跟管道一样,每个时间段产生的RDD就是其中的数据,所以每个时间段会产生一个RDD,每个时间段会产生。
03:21
RD,哎,就这么个概念啊,那如果你有多个stream的话,就等同于有多个管道,那咱们RDD呢,就顺着这个管子一点一点执行就行了,哎,就是这个意思,然后呢,我们再往下看,下面呢,其实就是我们SPA streaming,它底层呢,用用了一些特殊的方式来实现咱们的数据操作。但是呢,我们说了,它是没有办法达到真正的实时数据的,它延迟是有的,但是延迟不能太长,所以我们称之为叫做什么呢?叫准实时,对吧?嗯,就这个意思,好,接着往下,下面呢是我们的Dis STEM的一些创建的方式,比方说用我们的队列啊,Q的方式,呃,或者呢用socket,哎,或者呢,可以用我们的这个自定义的数据源,你自己来采集也是可以的啊,然后呢,我们后面呢,又给大家演示了一下我们的卡夫卡,这个在工作当中是用的非常的多的,我们的数据就来自于卡夫卡,那么你必须要保证你的卡夫卡的环境是正确的,那些基本的命令和操作不要忘记啊,最起码你用的时候知道去哪找啊,然后呢,我们的卡夫卡呢,有两种不同的处理方案啊,就是它的不同版本了,那么有一个叫receiver,有一个叫direct,那么这个receiver呢,就意味着我是独立的采集器,把数据发给我们的另外一个节点来做计算,可是你的这个采集速率。
04:41
跟消费速率如果不匹配的话,就可能会导致呢,我们的数据积压,导致我们出现问题,所以啊,我们还有另外一种方式叫direct API,它可以我们的采集和计算放在同一个节点上面,那么在同一个节点上面的情况下,那么这个时候我们可以均衡速率,对吧?诶,我采集的快,诶我们就慢一点,采集的慢我们就快一点,这其实都是可以的啊,那么在咱们新版本的使用当中,我们其实就只剩下direct模式了,这个咱们给大家去演示过这个操作啊,下来呢,给大家是吧,自己试一试,想一想,嗯,然后后面是什么呢?后面是我们的这个啊叫做转换,这个转换呢,其实就是有状态和无状态的一个概念,这个所谓的状态就是中间保存了一些临时的数据啊,比方说我们的word count,如果你这个采集周期你计算完了,那就结束了,那就叫无状态,但如果你把当前的统计结果保存起来,跟下一个的统计结果再做聚合。这个就。
05:41
就称之为叫有状态,所以这个先把这个状态无状态这个搞明白啊,那么然后呢,我们的无状态操作当中,它会有很多的方法啊,我们又额外补充了两个方法,一个叫transform,还有一个叫做John啊两个不同的方法,嗯,然后呢,我们那个有状态的这个操作呢,有一个叫update by key啊,就是通过key来更新状态,还有一个就是我们的那个window,那咱们那个window,这个window默认情况下其实也是无状态的,但是我们可以做一些中间数据的处理,让它有状态,这是完全可行的。而且这个窗口啊,它有一个大小的概念,就是把几个采集周期当成一个整体来做计算,所以啊,它有这么一个概念啊,还有一个叫滑动的幅度,就是说我们随着时间的推移,这个窗口范围是要滑动的,那么这个滑动就有可能出现重复数据,或者说不出出现重复数据,那么如果出现重复数据的话,那么这时候你要考虑到我们应该是哎,增加还是减。
06:41
很少对吧?哎,就是这样,如果你每一回都把重复数据给他计算了,性能就会比较低一些,所以这个我们要考虑实际的情况是这样的啊,还有一个就是我们那个窗口范围和窗口的那个滑动的步长应该是采集周期的整数倍,如果不是的话,会有一些问题。
07:00
然后呢,接下来下面呢,是我们的这个输出啊,所谓的输出呢,就是一般什么print打印啊,什么for循环啊,就是这样的一些内容,但是你记住了我们的实时数据,如果你要不。就是马上去做输出的话,那么你的数据可能就丢失了啊,你丢失了以后就可能找不回来了,这个跟咱们之前那个离线还不太一样,离线数据分析,比方说内存呢,包括咱们的这个文件呀,诶你如果诶数据出现了问题,你再重新读不就完了吗?它不会涉及到数据丢失的问题,所以在这种情况下,我们这个输出就必不可少,什么print呀,什么save呀,什么我们for啊,这个下来呢,要搞明白,而且比较简单嘛,并不是多复杂的事情啊。好,然后呢,后面就是我们优雅的关闭,所谓的优雅关闭呢,就是不强制关闭,对吧,我们给大家讲这个的时候是演示了一个我们的等待时间啊,稍微等一会儿把它关掉,那么这个关掉要判断当前环境对象的状态来决定是否关闭啊,这个操作呢,同学们下来呢,也是自己试一试啊。
08:04
好了,后面呢,其实就是我们的这个叫做案例实操了是吧,那咱们就简单的回顾到这就可以了啊同学们。
我来说两句