spark任务远程提交到yarn的两种方式

       很多同学都遇到spark远程提交到yarn的场景,但是大多数还是采用在spark安装的节点去执行spark submit,在某些场景下并不适合,这种情况下我们其实有2种方式可以达到远程提交的效果:

        先不急着说两种方法,首先我们先看一下spark在on yarn运行的时候需要一些什么文件吧,知道的提交机制才能明白怎么去完成远程提交的这个过程,下图为hdfs上每个spark任务执行的时候都需要的执行文件,大家可以打开hdfs的UI界面,启动一个任务,在/user/root/.sparkStaging目录下会生成任务对应的application_id目录,打开这个目录(记得要执行指令hadoop fs  -chmod -R 777 /user/root/.sparkStaging给目录授权,要不是看不任务内容的)有3个文件,只需要准备好这些文件我们就可以去启动spark任务了

如上图大家可以看到其实spark on yarn执行只需要3个文件:

1.配置文件:可以参考源码中的生成方式,一会后面会截图大致讲一下源码,当然这里当然有更方便的办法,启动一个任务把__spark_conf__.zip这个文件下载下来,然后解压出来,提交的时候呢,将里面文件的IP地址等参数修改成对应的就OK了,再打包成需要的zip文件,简单粗暴

2.spark相关依赖:可以从对应版本的spark安装包里面的jars目录下面取,将jars目录下所有文件打包成压缩文件就可以了

3.需要执行的程序:也就是我们编写的spark程序打成的jar包了

有了以上三点,我们其实就可以启动任务了

现在我们来说说第一种提交方式吧:

      第一种:采用yarn自身暴露的接口去提交任务

    首先yarn自身是提供了任务远程提交的接口的:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html#Cluster_New_Application_API,启动任务这里面有2接口是需要用到的:

1.生成applicationId的接口:http://rm-http-address:port/ws/v1/cluster/apps/new-application

          说明:调用改接口会生成applicationId,此时仅仅只是生成applicationId,任务还未启动

2.启动任务接口:http://rm-http-address:port/ws/v1/cluster/apps

       说明:将上面接口返回的applicationId替换启动任务接口,已经修改其他启动参数即可

这样的话,我们任务启动的步骤可以分为以下几步

(1)调用接口生成applicationId,并在hdfs的/user/root/.sparkStaging目录下生成名称为applicationId的目录

(2)生成上面截图的3个执行文件,上传到hdfs的applicationId目录下

(3)调用启动接口

完成以上3步,spark任务就可以在yarn上面运行了,当然yarn也提供了,监控状态和kill的接口,各位同学取上面的连接里面找就可以了

好了,我们来说下第二种提交方式吧

          第二种:集成spark提交部分的源码去解决问题

  要集成源码首先我们得把源码下载下来,此处附件以下下载地址:https://archive.apache.org/dist/spark/spark-2.4.0/,下载后我们打开看一下

 

我滴乖乖,这么多源码,到底要怎么集成呢,此时切记不要方,我们只需要找到入口就可以了,根据spark启动脚本,我们找到启动类其实就是:org.apache.spark.deploy.SparkSubmit,如下图:

       其实也没有那么多需要集成的,我们只需要把这个类,以及和它相关的类都给弄出来,需要集成的代码就弄出来了,当然弄出来肯定还是要和我们实际的程序结合起来,下面我们来说说源码里面的几个关键点吧

下图为任务提交的入口

来来来,跟着箭头走

继续走

继续继续

这一段就是我们提交的地方了,返回的就是applicationId了,需要的同学可以在这里和业务进行绑定

跟上跟上,走这

到了到了,这里面就是我们需要上传前面说的三个文件的地方了:

依赖包在这上传:

执行文件在这上传:

配置文件在这生成上传

完成这三步以后,我们看看这里,就完成了整个远程提交的过程

这个是调用Hadoop的hadoop-yarn-client依赖包里面的API,我们一样去调就行了,远程提交小编大致读了一下,主要是采用RPC的IPC协议去处理的,内部内容是属于hadoop的一部分,大家有兴趣可以再去下载hadoop的源码深入解读,但是对于我们的远程提交完成这一步去调用submitApplication这个方法就可以了(记得把配置文件比如core-site.xml文件放到工程里面)

总结一下第二种方法:

   (1)把这一块源码弄出来,

   (2)然后按照源码的方式配置执行文件,执行依赖包和配置文件可以先指定一个目录放进去,然后配置SPARK_CONF_DIR和SPARK_HOME的地址指向这两个目录就好了,源码中都有,稍微阅读一下就可以知道具体怎么配置了

  (3)把spark-submit指令转成Array[String]数组,去调用sparkSubmit.doSubmit接口就完成远程提交的过程了