怎样获得在yarn框架上运行jar包的执行结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样获得在yarn框架上运行jar包的执行结果相关的知识,希望对你有一定的参考价值。

1、打开Spring Boot应用,通过Maven命令package命令将应用打成jar包。

2、执行命令java -jar xx.jar启动Spring Boot应用,输入jsp页面对应的Url映射后,可以看到页面未找到。

3、用解压缩软件将jar包打开,可以看到jar包中并没有对应的webapps目录,所以上面报了页面未找到错误。

4、在pom文件的build节点下添加resource配置,目的是将webapps下的目录打包到jar文件的META-INF\\resources目录下。

5、再次执行package打包命令将应用打成war包,这次可以注意到jar包中META-INF\\resources目录下包含了webapps下的所有文件。

参考技术A 配置方法
(1) 首先需要确保spark在1.1.0以上的版本。
(2) 在HDFS上建立一个公共lib库,比如/system/spark-lib/,设置权限为755。把spark-assembly-*.jar上传到公共lib库中。
(3) 在spark-env.sh中配置:

view plaincopy to clipboardprint?
<span style="font-size:14px;">spark.yarn.jar hdfs://yarncluster/system/spark_lib/spark-assembly-1.1.0-hadoop2.3.0-cdh5.1.0.jarspark.yarn.preserve.staging.files false</span>

**spark.yarn.jar配置成HDFS上的公共lib库中的jar包。这个配置项会使提交job时,不是从本地上传spark-assembly*.jar包,而是从HDFS的一个目录复制到另一个目录(不确定HDFS上的复制是怎么操作的),总的来说节省了一点时间。(网上有的文章里说,这里的配置,会节省掉上传jar包的步骤,其实是不对的,只是把从本地上传的步骤改成了在HDFS上的复制操作。)
**spark.yarn.preserve.staging.files: 这个配置项配置成false,表示在执行结束后,不保留staging files,也就是两个jar包。然后HDFS上的.sparkStaging下的两个jar包在作业执行完成后就会被删除。如果配置成true,执行完后HDFS上的.sparkStaging下两个jar包都会保存下来。
然后再运行,发现HDFS上.sparkStaging目录下不会再保留jar包。
问题定位
按道理来说,因为spark.yarn.preserve.staging.files默认是false,所以HDFS上的jar包是不会被保留的。但是在spark1.0.2中,却没有删除。我看了下1.0.2的代码,删除的机制是存在的:
//yarn/alpha/src/main/scala/org/apache/spark/deploy/yarn/ApplicationMaster.scala

view plaincopy to clipboardprint?
<span style="font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:12px;"> /** * Clean up the staging directory. */ private def cleanupStagingDir() var stagingDirPath: Path = null try val preserveFiles = sparkConf.get("spark.yarn.preserve.staging.files", "false").toBoolean if (!preserveFiles) stagingDirPath = new Path(System.getenv("SPARK_YARN_STAGING_DIR")) if (stagingDirPath == null) logError("Staging directory is null") return logInfo("Deleting staging directory " + stagingDirPath) fs.delete(stagingDirPath, true) catch case ioe: IOException => logError("Failed to cleanup staging dir " + stagingDirPath, ioe) </span></span>
按照这个逻辑,默认在AM关闭的时候,是会删除HDFS上的jar包的。不过没有正常删除。推测这应该是一个1.0.2里面的bug,而在1.1.0里面已经修复。

nodemanager节点上的jar包缓存
升级到1.1.0版本后,HDFS上的jar包问题就解决了。但是nodemanager节点上的jar包还是会保留。这个问题的定位很纠结,不过结果却出乎意料的简单。不说了,上结果吧。
配置方法
(1) 配置yarn-site.xml:
<span style="font-family:Microsoft YaHei;font-size:12px;"> <property>
<name>yarn.nodemanager.local-dirs</name>
<value>local-dir1, local-dir2,local-dir3</value>
</property>
<property>
<name>yarn.nodemanager.localizer.cache.target-size-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.localizer.cache.cleanup.interval-ms</name>
<value>1800000</value>
</property></span>
**yarn.nodemanager.local-dirs: 这个目录是nodemanager上的作业中间数据存放路径。推荐配置多个盘上的多个路径,从而分散作业执行中的磁盘IO压力。
**yarn.nodemanager.localizer.cache.target-size-mb:配置nodemanager上的缓存目录的最大限度。nodemanager上有一个deletion server服务,会定期检测,如果yarn.nodemanager.local-dirs中配置的目录大小(如果配置了多个,则计算多个目录的总大小)是否超过了这里设置的最大限度值。如果超过了,就删除一些已经执行完的container的缓存数据。
因为spark提交作业后遗留在nodemanager上的jar包就在yarn.nodemanager.local-dirs下面,所以只要这里配置合适的大小值。那么nodemanager上的deletion server是会自动检测并保证目录总大小的。所以只要配置了这个量,我们就不需要再担心nodemanager上的jar包缓存问题了,交给yarn就好了!很简单啊有木有,可就这么个问题,居然花了我一个星期的时间去定位。
**yarn.nodemanager.localizer.cache.cleanup.interval-ms: deletion server多长时间做一次检测,并且清除缓存目录直到目录大小低于target-size-mb的配置。
通过上面这三个量的配置,nodemanager会确保本地的缓存数据总量在target-size-mb之下,也就是超过了的话,之前的spark的jar包就会被删除。所以我们就不需要再担心nodemanager节点上的spark jar包缓存问题了。不过target-size-mb的默认值是10G,这个值当然可以根据你的实际情况进行调整。

以上是关于怎样获得在yarn框架上运行jar包的执行结果的主要内容,如果未能解决你的问题,请参考以下文章

怎样获得在yarn框架上运行jar包的执行结果

Quartz定时调度jar包的执行Demo分享

怎样把jar包放到linux下运行

下载了lucene 3.0的jar包后,怎样运行? 刚接触lucene,求高手指点

jar 启动 springboot 怎样输入网址

Linux Shell 怎样获得命令的执行结果