00:00
好了,同学们,我们接下来来讲第五章Spark核心编程,在之前我们把Spark的基本环境,我们的一些程序啊,也都跑了一遍啊,是希望大家有一个直观的印象,那么我们接下来就进入到核心编程,看一看我们Spark到底在哪些方面,它提供了更好的计算方式啊,它都优化了哪些方面。那么首先第一个10SPAUG计算框架,为了能够进行高并发和高吞吐的数据处理,它封装了三大数据结构。应用于不同的场景,那么这三大数据结构呢?是RD加和广播变量,我们在后面的学习当中就会把这三大数据结构分别给大家进行讲解,以及深入到它的细节和源码上面。那么回过头来,我们先不考虑说这三大数据结构是什么,咱们先考虑的是什么叫数据结构,怎么去理解对吧?同学们首先从我们的概念上来讲,我们的数据结构,我们是计算机存储组织数据的方式,比方说我现在我想通过一个字符串A,我得到一个数字一,那么我问同学们,你该采用什么样的结构?
01:11
那我相信我刚才说过了,我给一个字符串A,我现在就想干嘛呢?得到一个一,我在给一个B,我想得到一个什么呢?二,那我问同学们,你们当碰见这样的需求的时候,你们该怎么去考虑我们用什么结构?我相信你用数组行吗?同学们,你用数组咱们叫阿瑞对吧?比方说我们的宿主在Java当中,那在我们skyla语言当中,我们称之为叫R瑞吧,我相信宿主不行,因为宿主呢是单个元素的存储吧。当然了,你说老师,那我纯成咱们GALA中的tale行不行,但tale它是一种什么?多个无关数据的组合,诶,所以呢,可以,但是我们说会有问题,什么问题呢?我说了,我要通过A来找到一就说明啊,我不需要考虑别的,如果你要用top的话,那你是不是得挨个遍利看哪个是A呀,诶有的时候不方便,所以拿这个数组啊,不是很方便,诶老师那拿咱们之前学的这个叫a list行不行。
02:07
对吧,咱们Java当中有个叫a list,在咱们的SKY当中有个叫SEQ,或者说直接list是不是也行,但是这个感觉跟我们的速度区别不大,比方说a list,它的底层的数据结构是不是就宿主啊,所以宿主就是一种结构,它是一种数据存储的方式,对不对?诶按照我们的顺序索引可以定位嘛,所以啊,这两个区别不大,用它的不合适我们应该能够想到了吧,同学们是不是用那个叫map呀?在我们的Java当中,我们一般是不是就是哈希map了,哈希map就可以实现这个功能,为什么?因为它的底层是由我们的速度加链表的吧,而数组加链表的方式,它可以通过我们的数据存储将K和V绑定在一起,那么这样的话,当我们去取这个的时候,V就能取到,就是这样,所以这样的话,我们的KV键值数据用map是一个好的选择。在Java中哈希map在咱们skyla语言当中,咱们就是map,哎,所以啊,这就是我们想象的一个数据结构,底层的速度再加上单向链表啊,在我们的JDK1.8之后,是不是还有新的红黑二啊,这个咱们就不说了,最起码我们想到了这种结构。
03:23
那么同样道理,我们所谓的数据结构,它就是数据组织和存储的方式,那所以我们这也差不多,你到底如何能够组织数据,让他能够在我们的计算当中可以高并发,高吞吐,诶,这是我们需要考虑的,那好,那么我们首先来给大家做一个小的例子,让大家理解一下这个数据结构怎么去理解,对吧?OK,来咱们看看同学们,呃,首先我现在呢,举个小例子吧,我现在做一个小的分布式的计算功能,同学们,看来我们现在呢,给大家准备一下。比方说啊,我们要是分布式的话,那咱们是不是得有两台节点机器啊,但是我这要准备两台机器有点太复杂了,所以啊,我们准备什么,两个Java的进程,就说两个Java虚拟机GM啊,然后呢,这个是GM,好,那我想做什么事情呢?我想由他来进行数据的准备和逻辑的准备,由他来真正执行,也就意味着呀,我想把这个Java虚拟机呢,当成我们的ex,他来进行真正执行,而我们这个呢,想把它当成咱们的driver啊,起到一个调度性的作用,准备的作用,然后我们想办法把我们的数据啊,计算逻辑干什么,我们要发送给我们的这个ex,让他真正执行,那么你要让他执行的话,大家想一想。
04:48
他计算完毕之后是要把结果返回给driver啊,所以我们的箭头来回来。回来以后,那这样的话不就OK了吗?诶,那么大家想想我的这个driver,他要想去给他发东西,那是不是意味着我的driver要连接它呀,但是呢,你又是两个不同的我们的进程,我们该怎么去连接呢?诶,这个时候我相信同学们会想到叫网络编程对吗?所谓的网络编程其实就是socket啊,咱们最简单的就是socket嘛,那么好,那我现在是不是就可以把咱们的这个execu当成个server啊,你把它当成一个server的话,你把这个当成一个client是不是就可以了?那么这样的话,我们的client向服务器发送消息没有问题吧,然后呢,当服务器处理完毕以后,将结果返回到客户端也没有问题吧?同学们,所以啊,咱们做一个简单的功能啊,那么我们既然这么说了,咱们准备一下。
05:48
好,那么在我们的这个位置当中,同学们看一下,我点击咱们这边来我们的new啊,创建一下好package啊,我们做一个小的分布式计算的练习啊,咱们写上一个test,然后点击OK,那么这个test当中我们点击我们的new,我现在呢,干嘛呀,我想创建一个我们的driver,咱们就叫driver吧,对吧?诶,咱们就叫driver,所以给他一个类,咱们叫做driver,那好,那么这个driver当中,我们是应该给他一个object,嗯,过来,好,然后呢,接下来我们再给他准备,我们点击我们创建一个我们叫做啊记住啊,我这个名是为了让大家好理解我这么起的名啊。
06:32
行了,那我这么写完以后,那么我们就是两个了,那我们的独立运行吧,所以我们的driver它有自己的main方法。它会有自己的焖方法啊,那么闷方法呢,它就会去启动自己的Java虚拟机,同样道理,我们的这个地方也是一样的啊,咱们这边好两个不同的焖方法,那么焖方法不一样的情况下,那么同学们想一想,那么在我们当前的场合下,我们是不是应该按照我们刚才画的这个图,我们要创建服务器端和客户端呢?所以别的咱不说啊,同学们来,咱别的不说,我先把这个服务器和客户端创建出来,嗯,这个类的位置好像创建错了,给他换个位置。
07:12
好,那我们现在呢,一块儿来操作一下,首先我们要把服务器先准备好,来我们在这儿写上啊,来咱们叫做什么呢?叫启动服务器来接收数据,所以我们写上一个咱们叫做server,然后等于叫new server啊,Server socket。好,就是它了,我们这里用的是最基本的一个网络编程的图像,这个大家如果不熟悉没有关系,大概再了解一下就行了,我们不会做的很复杂好吗?那么这个server socket呀,它里面会有一个什么呢?嗯,四个九吧,诶,咱们的端口号四个九,我们在当前的节点上面,我们去启动一个四个九端口的一个服务,好,那么你要在这边去启动服务的话,那么在driver端怎么办?是不是应该建立连接呀,所以我们写上来,我们写上叫连接我们的服务器,那么你要连接服务器的话,我们这边会有一个client,我们叫做new,咱们的socket,这个socket就意味着我要去连接我们的server了,好,把这个放过来,这里我们写上就是当前的机器节点,然后呢,是四个九,好了,那我这边呢,是我们的server这边呢,是我的客户端,那么我们的这个client,我现在呢,如果假设它连上了,连上了以后我该怎么办?
08:32
我是不是应该向咱们的服务器发东西啊,好了,那所以呢,我的client,我们点记住啊,我要发东西,那么这个时候呢,我们要有一个叫get output stream,咱们有一个输出流向我们的服务器来输出内容,好,那么你这样是输出没问题啊,那我这边是不是想办法要获取你的连接,并且得到你的输出啊,那就是我的输入嘛,所以我们来写上来啊,咱们叫做等待啊,呃,咱们这里呢,需要等待啊,或者叫做什么呢?就是等待啊,来写上咱们叫等待客户端啊,咱们叫客户端的连接。
09:11
那我现在呢叫server,它这边就会有一个叫accept,然后点一下点我们VR回车,回车以后咱们这边就是客户端,它连接了,只要有客户端连接过来,它就会得到一个客户端的连接对象啊,咱们就叫兰,如果要是没有人连这个服务器的话,那么我们当前的程序就会阻塞,所以啊,我加上一句话,咱们叫做print,嗯,好,我们写上咱们叫服务器启动啊,服务器启动等待。接收数据。咱们叫接收数据啊,好了,那我现在服务器启动了,我们要等待接收数据了,那我现在是不是得发数据了,所以来吧,我们这里来写上咱们叫做点。咱们叫VR回车,回车以后这个地方我就写个out,然后拿过来,拿过来以后点,点了之后呢,给它来,我们直接写上一个right就行了,那么这个right呢,我就随便写一个,我就写个二吧,好,然后呢,Out点我们的这个叫做什么呢?Fla,然后呢,我们这边直接嗯,我就嗯out.close吧,点我们的close,然后把这个client他们也关掉,诶就是这个意思啊,点我们的close好了,当我发送完毕之后,那我们这边就关掉,哎,就是这个概念啊,就是这么个意思,那行,那么我们的executor应该怎么办,同学们。
10:33
他是不是应该接收消息,那么如果接收消息的话,是不是应该有一个叫输入流啊,所以client咱们点叫get input stream。好了,然后点一下咱们叫VAR回车,回车以后咱们这个地方叫做in啊,咱们叫做in,好,那么我们in点我们叫做read,诶咱们叫做read,这个read我拿到以后呢,点我们叫VAR回车,回车以后,那么这就是我拿到的值,记住我们就写上了,来我们叫print啊,我们叫做客户端啊,咱们叫做接收到接收到客户端发送的数据,这个数据是多少呢?就是那个IOK,那我现在呢,来咱们现在就可以了,呃,我这边给他写上咱们叫client啊,咱们,诶咱们写上这个叫in,点我们的close,然后呢,再来我们的client.close其实呀,咱们服务器也就可以关了啊,就是简单的演示嘛,所以我们的close。
11:36
好了,同学们,就这么简单啊,那我现在就可以在我们服务器和客户端之间,我们建立连接,来发送数据,来发送消息,对不对,好了,那咱们一块儿来看一看,嗯。现在我们先把服务器啊,咱们的server先启动好啊,咱们先启动好,来我们运行。运行以后看结果,当我运行好以后,它处于主设状态,为什么呢?没有客户端去连接它吗?所以在我们当前的这个控台当中,它应该是什么,处于一个等待的操作。
12:09
好,大家听到服务器启动,等待接收数据,为什么呢?它处于主摄状态,这个时候我们需要咱们的driver去连一下了,所以来运行,运行之后看结果,好,大家听到driver已经执行完了,为什么?因为我的数据发过去了,发过去以后它直接close了,那么就结束了,回过头来看我们的ec,你看。这个数据是不是被接收到了,所以啊,我们现在就已经拿到了咱们的数据,诶你能发他能收这个通信是没有问题的,对吗?同学们诶,先把一个简单的架子,咱们先搭建起来。
我来说两句