staging目录的用途
关于staging目录可能很多人都不太会关注,毕竟日常运行作业也用不到这些配置。不过了解它对于我们理解作业的执行流程也是有所帮助的,比如我们都会使用hadoop jar 或 spark-submit等命令来提交一个MR或Spark作业,然后我们就会看到在集群的某些计算节点上启动executor(MapRedece对应的是mapper和reducer)来执行任务。这些executor都是一个JVM进程,既然如此,那么启动一个JVM进程必然需要用到至少一个jar包,那这些jar包是从哪里来的呢?此时就用到了staging 目录(有人把staging翻译为舞台目录,这也有一定的含义,提交作业,就要登上集群这个舞台了)了。提交作业的时候,会把相关的jar包和配置信息都上传到这个staging目录下,然后在启动executor之前,会从这里将这些信息下载到计算节点本地。
MapReduce作业Staging的配置
- yarn.app.mapreduce.am.staging-dir:提交mapreduce作业的staging目录,默认是/tmp/hadoop-yarn/staging
- yarn.app.mapreduce.am.staging-dir.erasurecoding.enabled:staging目录下的文件是否使用纠删码方式存储,默认false,这可以在提交作业时指定
- mapreduce.client.submit.file.replication:提交到staging目录下的文件的副本数,默认是10
- mapreduce.job.split.metainfo.maxsize:split元数据信息文件的最大大小,默认10000000,超过该大小AppMaster将不会再读取。设置为-1,则表示不限制该文件的大小。这个文件通常不会很大,一般也不会去单独设置
示例
下面从一个实际的MR作业来看一下stageing目录中的内容,可以看到文件job.jar和job.split以及libjars目录中的文件副本数都是10,这个10就是由配置项mapreduce.client.submit.file.replication指定的
下面通过提交一个测试作业验证一下这个配置项,指定mapreduce.client.submit.file.replication为12
作业提交后,查看对应的staging 目录文件,如下,说明配置参数生效了
最后解释一下这些文件的副本为什么是10呢,难道3副本还不能满足数据安全的要求吗?这里其实涉及到MR作业运行时的一个步骤就是资源本地化,本文开头已经介绍过staging目录的作用了,而比如一个MR作业的mapper有几百几千个的时候,那么就意味着会有上千的客户端会同时下载这个jar包,此时将这个jar包的副本数设置的大一点可以提高资源本地化的效率,而反之如果只是一个很小的MR作业,这么高的副本数就是浪费了。这也侧面说明了MR的设计初衷就是面向大规模数据的。
Spark 作业Staging目录的配置
下面是spark on yarn模式下的配置
- spark.yarn.submit.file.replication:提交作业时上传到HDFS相关文件的副本数,默认是HDFS的默认副本数,通常是3
- spark.yarn.stagingDir:提交作业时的staging目录,默认是用户的家目录
- spark.yarn.preserve.staging.files:在提交作业时的staged 文件(Spark jar, app jar, distributed cache files) 在作业结束时是否保留,默认false,也就是作业执行结束后进行删除
示例
下面从一个实际的Spark作业来看一下stageing目录中的内容
可以看到,和MR作业的Staging目录相比,spark并未将spark的jar包设置为10副本;而且把配置信息和jar包分别进行了压缩,结构相对简单一点。