Spark内核源码(二)----反射执行对象方法

Spark内核源码—反射执行对象方法

上一篇我们走到了提交方法runMain这个方法,我们上次说了,只要走完这个方法,整个逻辑就结束了,那么它到底,走了什么
在这里插入图片描述
它调用了prepareSubmitEnvironment(args)方法,意思是准备提交的环境,那么,它左边的三个值又是什么呢?我们将源码往下看
在这里插入图片描述
在这里插入图片描述
我们点这个反射进去
在这里插入图片描述
将我们指定的类名,加载到我们的方法去内存空间当中,ClassName是类的名称,而Class.forName是加载的过程,早期的JDBC都是这样干的,那我们回退到它上一层就知道它是在加载这个类,得到这个类,可是我们得到这个类的信息要干嘛呢?我们继续往下走
在这里插入图片描述
我们前面是在得到这个类,而我们这里mainClass在调用newInstance(),是不是在构建它的实例啊,并将它转换成SparkApplication,其实对于框架本身而言,反射和注解用的是最多的,这里它主要干了创建对象。
在这里插入图片描述
对象调用了启动方法,我们着重看一下这个方法在干嘛
在这里插入图片描述
那我们后退,看一下,我们缕一缕,我们调用了一个start,谁调用的,app调用的,app对象怎么来的,是mainClass调用newInstance()生成的,而mainClass又是怎么来的,是上面我们经过反射,赋值给它的
在这里插入图片描述
那么这个括号里面的参数名称childMainClass又是什么,我们往前走,看一看
在这里插入图片描述
逻辑是这样的,它就是前期准备工作,把这个类找到,然后加载这个类,创建它的对象,最后启动执行它的方法我们要是能把它后面这个方法prepareSubmitEnvironment看明白了,其他的不都看明白了么,我们这就点击进去看一下看源码保持一个习惯,就是有返回值,我们不要看最开始的部份,要看最后,因为执行逻辑在后面,光看返回值是没有用的,我们一直往下翻就好了。
在这里插入图片描述
他这个都是返回值了,那么肯定赋值了,这个赋值,一定是最后赋值的才起作用,比如第一行附了值,第五行附了值,第七行附了值,肯定事第七行赋值起作用,我们一起去找一找,所以我们搜索
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
yarnCluster的值给了YARN_CLUSTER_SUBMIT_CLASS,那我们就进入到YARN_CLUSTER_SUBMIT_CLASS中去看一看
在这里插入图片描述
我们的Yarn,有两种方式来做Yarn集群,而我们这个告诉我们明显是Cluster模式,所以我们看看有没有另外一种模式,我们再往上面找一找
在这里插入图片描述
这个其实就是客户端模式,我们的客户端模式会将底下的mainClass给这个Client,所以说,如果你是客户端模式,我们就将mainClass给childMainClass这个值,我们前面提交源码中提到,如图下:
在这里插入图片描述
也就是相当于将xxxx.WordCount给了mainClass,两种模式在这个地方还是有关联的,一个是客户端模式,一个是集群模式,我们更关注的是集群模式,所以它走的肯定就是org.apache.spark.deploy.yarn.YarnClusterApplication这个类,我们之前在上面图中看到过这个类,这个类找到了,我们后面加载这个类,创建对象,调用方法不就串联起来了么,为了让大家更加清晰这个思路,我们上依赖关系,并画图阐述,为什么上依赖呢,因为我们这个类你会发现是yarn的,我们core中式没有这个类的,所以加载yarn依赖,我们找到这个类
在这里插入图片描述
在这里插入图片描述
**在这里插入图片描述**
原来这里它做了三步操作,一个是new Client,还有一个是new ClientArguments(args),一个是run(),欲知详情,且听下回分解

猜你喜欢

转载自blog.csdn.net/weixin_45284133/article/details/106600327