這篇文章主要講解了“deploy目錄下SparkSubmit類的用法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“deploy目錄下SparkSubmit類的用法”吧!
公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出青浦免費(fèi)做網(wǎng)站回饋大家。
之前說(shuō)的各種腳本:spark-submit,spark-class也好,還是launcher工程也好,主要工作是準(zhǔn)備各種環(huán)境、依賴包、JVM參數(shù)等運(yùn)行環(huán)境。實(shí)際的提交主要還是Spark Code中的deploy下的SparkSubmit類來(lái)負(fù)責(zé)的。
deploy目錄下的SparkSubmit類,前面提到過(guò),主要入口方法是runMain。
我們先看看其他方法吧。
1、prepareSubmitEnvironment
這個(gè)方法準(zhǔn)備提交的環(huán)境和參數(shù)。
先判斷集群管理方式(cluster manager):yarn、meros、k8s,standalone。部署方式(deploy mode ): client還是cluster。
后面要根據(jù)這些信息設(shè)置不同的Backend和Wapper類等。
提交模式這一段真不好講,因?yàn)樗颂喾N類的部署環(huán)境了,個(gè)性化較強(qiáng),要慢慢看了。
cluster方式只看兩種:yarn cluster和standalone cluster。把yarn和standalone兩個(gè)搞懂了,其他的也就很好理解了。
這個(gè)方法返回一個(gè)四元組:
@return a 4-tuple:
* (1) the arguments for the child process,
* (2) a list of classpath entries for the child,
* (3) a map of system properties, and
* (4) the main class for the child
核心代碼
if (deployMode == CLIENT) { childMainClass = args.mainClass if (localPrimaryResource != null && isUserJar(localPrimaryResource)) { childClasspath += localPrimaryResource } if (localJars != null) { childClasspath ++= localJars.split(",") } } // Add the main application jar and any added jars to classpath in case YARN client // requires these jars. // This assumes both primaryResource and user jars are local jars, or already downloaded // to local by configuring "spark.yarn.dist.forceDownloadSchemes", otherwise it will not be // added to the classpath of YARN client. if (isYarnCluster) { if (isUserJar(args.primaryResource)) { childClasspath += args.primaryResource } if (args.jars != null) { childClasspath ++= args.jars.split(",") } } if (deployMode == CLIENT) { if (args.childArgs != null) { childArgs ++= args.childArgs } } if (args.isStandaloneCluster) { if (args.useRest) { childMainClass = REST_CLUSTER_SUBMIT_CLASS childArgs += (args.primaryResource, args.mainClass) } else { // In legacy standalone cluster mode, use Client as a wrapper around the user class childMainClass = STANDALONE_CLUSTER_SUBMIT_CLASS if (args.supervise) { childArgs += "--supervise" } Option(args.driverMemory).foreach { m => childArgs += ("--memory", m) } Option(args.driverCores).foreach { c => childArgs += ("--cores", c) } childArgs += "launch" childArgs += (args.master, args.primaryResource, args.mainClass) } if (args.childArgs != null) { childArgs ++= args.childArgs } } // In yarn-cluster mode, use yarn.Client as a wrapper around the user class if (isYarnCluster) { childMainClass = YARN_CLUSTER_SUBMIT_CLASS if (args.isPython) { childArgs += ("--primary-py-file", args.primaryResource) childArgs += ("--class", "org.apache.spark.deploy.PythonRunner") } else if (args.isR) { val mainFile = new Path(args.primaryResource).getName childArgs += ("--primary-r-file", mainFile) childArgs += ("--class", "org.apache.spark.deploy.RRunner") } else { if (args.primaryResource != SparkLauncher.NO_RESOURCE) { childArgs += ("--jar", args.primaryResource) } childArgs += ("--class", args.mainClass) } if (args.childArgs != null) { args.childArgs.foreach { arg => childArgs += ("--arg", arg) } } }
上面這段代碼非常核心,非常重要。它定義了不同的集群模式不同的部署方式下,應(yīng)用使用什么類來(lái)包裝我們的spark程序,好適應(yīng)不同的集群環(huán)境下的提交流程。
我們就多花點(diǎn)時(shí)間來(lái)分析一下這段代碼。
先看看ChildMainClass:
standaloneCluster下:REST_CLUSTER_SUBMIT_CLASS=classOf[RestSubmissionClientApp].getName()
yarnCluster下:YARN_CLUSTER_SUBMIT_CLASS=org.apache.spark.deploy.yarn.YarnClusterApplication
standalone client模式下:STANDALONE_CLUSTER_SUBMIT_CLASS = classOf[ClientApp].getName()
2、runMain
上一步獲得四元組之后,就是runMain的流程了。
核心代碼先上:
private def runMain(args: SparkSubmitArguments, uninitLog: Boolean): Unit = { val (childArgs, childClasspath, sparkConf, childMainClass) = prepareSubmitEnvironment(args) val loader = getSubmitClassLoader(sparkConf) for (jar <- childClasspath) { addJarToClasspath(jar, loader) } var mainClass: Class[_] = null try { mainClass = Utils.classForName(childMainClass) } catch { } val app: SparkApplication = if (classOf[SparkApplication].isAssignableFrom(mainClass)) { mainClass.getConstructor().newInstance().asInstanceOf[SparkApplication] } else { new JavaMainApplication(mainClass) } try { app.start(childArgs.toArray, sparkConf) } catch { case t: Throwable => throw findCause(t) } }
搞清了prepareSubmitEnvironment的流程,runMain也就很簡(jiǎn)單了,它就是啟動(dòng)ChildMainClass(是SparkApplication的子類),然后執(zhí)行start方法。
如果不是cluster模式而是client模式,那么ChildMainClass就是args.mainClass。這點(diǎn)需要注意下,這時(shí)候ChildMainClass就會(huì)用JavaMainApplication來(lái)包裝了:
new JavaMainApplication(mainClass);
后面的內(nèi)容就是看看RestSubmissionClientApp和org.apache.spark.deploy.yarn.YarnClusterApplication的實(shí)現(xiàn)邏輯了。
感謝各位的閱讀,以上就是“deploy目錄下SparkSubmit類的用法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)deploy目錄下SparkSubmit類的用法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
本文名稱:deploy目錄下SparkSubmit類的用法
網(wǎng)頁(yè)網(wǎng)址:http://www.rwnh.cn/article4/jcjgoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、商城網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、響應(yīng)式網(wǎng)站、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)