一.问题来源
为什么我们在windows下用编程集成工具或者linux下用编程集成工具来run我们编写的mr程序的时候是在本地jvm中运行,而我们在linux上用命令行:hadoop jar 提交我们的jar文件的时候就提交到集群去运行了呢?
具体原因是:如果是RunJar中包含了和RM通信的rpc客户端就是把jar包提交到集群运行,如果RunJar中包含了和本地机器通讯的客户端的话,就是把jar包提交到本地的jvm中运行。这些都是根据配置文件来配置的。
Configurationconf = new Configuration().是由这个来决定的。如果你conf里面设定了mapreduce.framework.name的value为yarn的话,它就会初始化一个持有和yarn通信的rpc客户端,如果没有设置,则会初始化一个和本地通信的客户端。
二.提交模式分类
本地提交模式
① 在windows或者linux上访问的本地文件系统上的文件,生成的结果也是在本地文件系统上面
这种模式的启动模式是本地启动,并没有将程序上传到集群里面去。
② 在windows或者linux上访问的文件是hdfs上的文件,生成的结果也是输出到hdfs上面。
这种模式虽然读取的是hdfs上的文件,但是也没有将程序上传到集群去执行,最终还是一种本地启动模式。
这个staging的资源文件是在本地文件系统上面,而非是在hdfs上面,所以还是一种本地启动模式。
集群提交模式
③ 把程序打成jar包,上