BTW,很多时候定位问题,查清楚问题的原因,比解决这个”问题“要更重要。
问题描述
spark版本是1.0.2,运行在cdh5.1.0-hadoop2.3.0版本的yarn上面。在每次提交作业执行之后,在我的HDFS的${yarn.app.mapreduce.am.staging-dir}/${username}/.sparkStaging下面,就会产生两个jar包,一个是spark-assembly-*.jar,另一个是提交执行的jar包。同时,在这个作业对应的executor的节点上,${yarn.nodemanager.local-dirs}目录下,也会有这两个jar包。而且不会被删除。
光spark-assembly*.jar就有一百多M,每次执行完都会留下这么多jar包,虽然不大,但可想而知,日积月累,可是个很麻烦的事情。所以,要搞清楚为啥会出现这个情况。
这个问题可以拆分成两个sub-task,一个是HDFS上的jar包为啥不会自动删除,一个是nodemanager节点上的jar包的自动删除。下面分别排查和解决:
HDFS上的jar包缓存
网上貌似很少有相关资料,就是找到了一个介绍如何配置spark.yarn.jar的文章,说是可以解决HDFS上的jar包缓存的问题。照着配置了一下,不起作用,又看作者说,要spark1.1.0以上的版本,所以重新编译了spark1.1.0,把集群的spark1.0.2升级到1.1.0。重新配置spark.yarn.jar,发现问题解决了。HDFS上仍然在每次提交作业时都会被上传两个jar包,但是用完后会自动删除。
配置方法