【罗盘时钟附源码】【墨鱼博客源码】【解析 java文件源码】submit源码

时间:2024-11-19 04:16:54 编辑:神兽源码2020修复 来源:视频源码分析

1.以源文件的源码形式交作业是啥意思?
2.Spark源码解析2-YarnCluster模式启动
3.Spark-Submit 源码剖析
4.document.form.submit()

submit源码

以源文件的形式交作业是啥意思?

       Spark作业提交方式一般有两种,一种是源码使用spark-submit脚本进行提交作业,另一种方式是源码使用rest api方式,但是源码有时候由于集群的安全原因可能无法使用rest api方式进行提交作业,但是源码由于业务需要的话我们可以直接调用SparkSubmit.main方法进行api方式提交作业。(当然也可以使用ProcessBuilder执行shell脚本提交)。源码罗盘时钟附源码除了通常两种情况,源码Spark其实还提供了API提交作业的源码方法。

       1 调用SparkSubmit提交作业:

       为了使用SparkSubmit#main方法方式提交作业,源码因此重点就是源码需要构造参数,我们可以根据spark-submit脚本源码进行构造参数,源码翻阅spark-submit源码不难发现最终调用的源码是spark-class脚本提交作业,spark-class脚本中最核心的源码代码如下:

       exec "${ CMD[@]}"

       因此只要我们弄清楚 "${ CMD[@]}"参数是什么就可以解决问题,最好的源码方法就是在spark-class脚本中添加echo 打印出来看看。打印结果如下:

       /usr/local/jdk1.8.0_/bin/java -cp /home/daxin/bigdata/spark/conf/:/home/daxin/bigdata/spark/jars/*:/home/daxin/bigdata/hadoop/etc/hadoop/:/home/daxin/bigdata/hadoop/etc/hadoop/ -Xmx1g org.apache.spark.deploy.SparkSubmit --master yarn --class com.daxin.remote.debug.App wc.jar

       由于我们提交的源码墨鱼博客源码作业是使用yarn调度,因此需要传入hadoop相关配置。如果使用yarn调度却没有传入hadoop配置文件的话此时会提示操作不到ResourceMangaer,即信息如下:

       0.0.0.0/0.0.0.0:. Already tried 7 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=, sleepTime=1 SECONDS)

       正常spark脚本提交作业时候hadoop等相关配置文件是通过classpath传入的,因此我们在classpath传入即可。

       2:使用SPARK API提交作业。

       参考文档:https://spark.apache.org/docs/latest/rdd-programming-guide.html#launching-spark-jobs-from-java--scala,内容比较简单就不描述了。

       此处需要注意:

       如果Spark提交作业和Spring boot的jar整合的话,使用-cp是启动不起来的,由于Spring打包插件比较特殊,jar内部的目录结构与一般的jar结构不一样,所以使用-cp 指定mainclass会提示无法找到类,对于该情况可以将-cp与-jar联合使用。

       例如:

       java -cp 普通.jar -jar springboot.jar

       最后还需要注意的解析 java文件源码就是:Linux权限问题,有时候可能因为classpath下面的配置文件没有权限读,因此也是会失败的,一定要确保有权限。

Spark源码解析2-YarnCluster模式启动

       YARN 模式运行机制主要体现在Yarn Cluster 模式和Yarn Client 模式上。在Yarn Cluster模式下,SparkSubmit、ApplicationMaster 和 CoarseGrainedExecutorBackend 是独立的进程,而Driver 是独立的线程;Executor 和 YarnClusterApplication 是对象。在Yarn Client模式下,SparkSubmit、ApplicationMaster 和 YarnCoarseGrainedExecutorBackend 也是独立的进程,而Executor和Driver是对象。

       在源码中,SparkSubmit阶段首先执行Spark提交命令,编译android内核源码底层执行的是开启SparkSubmit进程的命令。代码中,SparkSubmit从main()开始,根据运行模式获取后续要反射调用的类名赋给元组中的ChildMainClass。如果是Yarn Cluster模式,则为YarnClusterApplication;如果是Yarn Client模式,则为主类用户自定义的类。接下来,获取ChildMainClass后,通过反射调用main方法的过程,反射获取类然后通过构造器获取一个示例并多态为SparkApplication,再调用它的start方法。随后调用YarnClusterApplication的start方法。在YarnClient中,去掉tfs源码控制new一个Client对象,其中包含了yarnClient = YarnClient.createYarnClient属性,这是Yarn在SparkSubmit中的客户端,yarnClient在第行初始化和开始,即连接Yarn集群或RM。之后就可以通过这个客户端与Yarn的RM进行通信和提交应用,即调用run方法。

       ApplicationMaster阶段主要涉及开启一个Driver新线程、AM向RM注册、AM向RM申请资源并处理、封装ExecutorBackend启动命令以及AM向NM通信提交命令由NM启动ExecutorBackend。在ApplicationMaster进程中,首先开启Driver线程,开始运行用户自定义代码,创建Spark程序入口SparkContext,接着创建RDD,生成job,划分阶段提交Task等操作。

       在申请资源之前,AM主线程创建了Driver的终端引用,作为参数传入createAllocator(),因为Executor启动后需要向Driver反向注册,所以启动过程必须封装Driver的EndpointRef。AM主线程向RM申请获取可用资源Container,并处理这些资源。ExecutorBackend阶段尚未完成,后续内容待补充。

Spark-Submit 源码剖析

       直奔主题吧:

       常规Spark提交任务脚本如下:

       其中几个关键的参数:

       再看下cluster.conf配置参数,如下:

       spark-submit提交一个job到spark集群中,大致的经历三个过程:

       代码总Main入口如下:

       Main支持两种模式CLI:SparkSubmit;SparkClass

       首先是checkArgument做参数校验

       而sparksubmit则是通过buildCommand来创建

       buildCommand核心是AbstractCommandBuilder类

       继续往下剥洋葱AbstractCommandBuilder如下:

       定义Spark命令创建的方法一个抽象类,SparkSubmitCommandBuilder刚好是实现类如下

       SparkSubmit种类可以分为以上6种。SparkSubmitCommandBuilder有两个构造方法有参数和无参数:

       有参数中根据参数传入拆分三种方式,然后通过OptionParser解析Args,构造参数创建对象后核心方法是通过buildCommand,而buildCommand又是通过buildSparkSubmitCommand来生成具体提交。

       buildSparkSubmitCommand会返回List的命令集合,分为两个部分去创建此List,

       第一个如下加入Driver_memory参数

       第二个是通过buildSparkSubmitArgs方法构建的具体参数是MASTER,DEPLOY_MODE,FILES,CLASS等等,这些就和我们上面截图中是对应上的。是通过OptionParser方式获取到。

       那么到这里的话buildCommand就生成了一个完成sparksubmit参数的命令List

       而生成命令之后执行的任务开启点在org.apache.spark.deploy.SparkSubmit.scala

       继续往下剥洋葱SparkSubmit.scala代码入口如下:

       SparkSubmit,kill,request都支持,后两个方法知识支持standalone和Mesos集群方式下。dosubmit作为函数入口,其中第一步是初始化LOG,然后初始化解析参数涉及到类

       SparkSubmitArguments作为参数初始化类,继承SparkSubmitArgumentsParser类

       其中env是测试用的,参数解析如下,parse方法继承了SparkSubmitArgumentsParser解析函数查找 args 中设置的--选项和值并解析为 name 和 value ,如 --master yarn-client 会被解析为值为 --master 的 name 和值为 yarn-client 的 value 。

       这之后调用SparkSubmitArguments#handle(MASTER, "yarn-client")进行处理。

       这个函数也很简单,根据参数 opt 及 value,设置各个成员的值。接上例,parse 中调用 handle("--master", "yarn-client")后,在 handle 函数中,master 成员将被赋值为 yarn-client。

       回到SparkSubmit.scala通过SparkSubmitArguments生成了args,然后调用action来匹配动作是submit,kill,request_status,print_version。

       直接看submit的action,doRunMain执行入口

       其中prepareSubmitEnvironment初始化环境变量该方法返回一个四元 Tuple ,分别表示子进程参数、子进程 classpath 列表、系统属性 map 、子进程 main 方法。完成了提交环境的准备工作之后,接下来就将启动子进程。

       runMain则是执行入口,入参则是执行参数SparkSubmitArguments

       Main执行非常的简单:几个核心步骤

       先是打印一串日志(可忽略),然后是创建了loader是把依赖包jar全部导入到项目中

       然后是MainClass的生成,异常处理是ClassNotFoundException和NoClassDeffoundError

       再者是生成Application,根据MainClass生成APP,最后调用start执行

       具体执行是SparkApplication.scala,那么继续往下剥~

       仔细阅读下SparkApplication还是挺深的,所以打算另外写篇继续深入研读~

document.form.submit()

       å¾ˆå¥‡æ€ªçš„问题,呵呵。。被我碰到了。

       å¾ˆç®€å•,将页面中名称为"submit"的控件改一下名称就可以了

       æ¯”如:

       æœ‰ä¸€ä¸ªsubmit按钮名字叫submit

       <input type="submit" name="submit" value="提交"/>

       ä½ æŠŠè¿™ä¸ªåç§°æ”¹ä¸€ä¸‹

       <input type="submit" name="submit1" value="提交"/>

       -------------------------------------------------------------------

       è¿™ä¸¤å¤©åšåˆ—表数据显示的时候,几乎被"对象不支持此属性和方法" 的错误提示搞疯掉了,两个完全一样的程序(事后才知道有个单词的大小写

       ä¸ä¸€æ ·ï¼‰ï¼Œç«Ÿç„¶ä¸€ä¸ªæ˜¾ç¤ºæ­£å¸¸ï¼Œä¸€ä¸ªå´é¢‘繁提示出错。

       åœ¨ä¸€èˆ¬æƒ…况下,同一个表单只能被提交给同一个地址。但在实际web应用中,我们希望同一个表单可以根据用户的选择来完成不同的操作,即表

       å•çš„分向提交。比如说:在一个网站后台用户管理系统中,我需要对一些恶意的用户进行批量解锁,锁定用户或者删除的操作,当我从select

       ä¸­é€‰æ‹©åˆ é™¤ä¼šå‘˜æ—¶ï¼Œæˆ‘们希望表单会提交给能进行删除的处理程序,当我 从select 中选择锁定会员时,我们希望表单会 提交到锁定会员的处

       ç†ç¨‹åºï¼Œè§£é”ä¼šå‘˜ 也如此。我们极不愿意看到分别为这三个功能建立三个不同的页面,而其中仅仅 是处理程序不同。

       åˆ©ç”¨å®¢æˆ·ç«¯JavaScript的功能,我们简化可以把三项功能简化一个界面就可以完成,一个select,其中放置要进行的操作,一个Submit按钮(其

       å®žä¸€ä¸ªæ™®é€šçš„Button也可以实现,)

       <form action="?" method="post" enctype="application/x-www-form-urlencoded" name="listfrm" id="listfrm">

       <label>

       <select name="Action" size="1" id="Action">

       <option value="delete">删除</option>

       <option value="lock">删除</option>

       <option value="unlock">删除</option>

       </select>

       </label>

       <input name="Submit" id="Submit" type="submit" value="确定" onclick="doPostBack(this.form,'?" />

       </form>

       è¿™æ˜¯JavaScript中doPostBack函数的源代码,其中传递的参数为表单对象的引用和表单的action文件地址

       function doPostBack(formObj,actionFile){

       if(confirm("确定要执行的操作吗?")){

       formObj.action=actionFile;

       formObj.submit();

       return true;

       }

       return false;

       }

       è¿™æ ·å¯ä»¥åœ¨ä¸€ä¸ªè¡¨å•ä¸­æ”¾ä¸Šå¤šä¸ªButton,甚至是连接,都可以实现同一个表单的提交给不同的处理程序。

       åœ¨åšè¡¨å•å¤„理时要注意:

       1、表单应该包含name,aciton,method这三个必须的属性,enctype,id这两个属性可以根据需要加上,一般是建议加上,表单不要嵌套

       2.document.form.action与document.form.submit()一定不要搞混,action是属性,submit是方法,方法不要忘记加上左右括号,这是一般新手经常遇到的问题。

       3.在一个完整表单中,不应有名字为action或submit的标签,否则将会产生"对象不支持此属性和方法"的ie错误。如代码"<input type='xxxx' name="action" >"或"<input type='xxxx' name="submit" >" 在表单中是不允许出现的,而Action和Submit则是允许的(上面的程序代码就是用的是这样的写法),因为JavaScript是区分大小写.

搜索关键词:网页隐藏链接源码