java 远程 yarn jar,怎样在yarn框架上运行jar包并返回

2016-04-13 回答

配置方法 (1) 首先需要确保spark在1.1.0以上的版本。 (2) 在hdfs上建立一个公共lib库,比如/system/spark-lib/,设置权限为755。把spark-assembly-*.jar上传到公共lib库中。 (3) 在spark-env.sh中配置: view plaincopy to clipboardprint? 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 **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? /** * 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) } } 按照这个逻辑,默认在am关闭的时候,是会删除hdfs上的jar包的。不过没有正常删除。推测这应该是一个1.0.2里面的bug,而在1.1.0里面已经修复。 nodemanager节点上的jar包缓存 升级到1.1.0版本后,hdfs上的jar包问题就解决了。但是nodemanager节点上的jar包还是会保留。这个问题的定位很纠结,不过结果却出乎意料的简单。不说了,上结果吧。 配置方法 (1) 配置yarn-site.xml: yarn.nodemanager.local-dirslocal-dir1, local-dir2,local-dir3yarn.nodemanager.localizer.cache.target-size-mb1024yarn.nodemanager.localizer.cache.cleanup.interval-ms1800000 **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,这个值当然可以根据你的实际情况进行调整。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值