1. MR中的一个Job是如何提交的?
首先我们要先判断当前Job的状态是否为定义阶段, 如果是我们提交一个submit()方法, 然后我们需要确认当前Job的状态, 新老API是否兼容, 接着我们就开始连接集群, 如果我们连接的是本地模式结果就是LocalRunner, 如果连接的是Yarn集群结果就是YARNRuuner; 在提交Job之前需要检验一下输入输出路径是否合法, 并且给当前的Job计算一下切片信息, 然后添加一下分布式缓存文件, 将所有必要的内容都拷贝到job执行的临时目录,比方说一些jar包啊, 切片信息还有配置文件; 最后开始提交Job
2. 描述一下YARN的工作机制。
首先MR程序提交到客户端所在的节点,YarnRunnable向RM申请一个Application, RM向YarnRunnable返回Application的提交路径及其application_id, 紧接着YarnRunnnable提交job运行所需要的资源到HDFS上, 在job.submit()运行后会生成一系列的文件. 在资源提交完毕之后, 向RM申请运行MRApplication, 然后RM将用户的请求初始化程一个Task, Task随即进入FIFO调度队列, 再接着NodeManager领取到Task任务, 创建Container容器并产生MRAppmaster, 将job资源从HDFS下载到本地, NodeManager向RM申请运行MapTask, RM将MapTask分配给其他两个NodeManager, 另外两个NodeManager领取到任务后继续创建Container容器运行MapTask, 根据MR发送的程序启动脚本运行任务, 分别启动MapTask对数据进行分区排序, 完成这些后, NodeManageer继续向RM申请2个容器, 运行ReduceTask程序, Reduce向Map获取相应分区的数据, 最后程序运行完毕之后, MR会向RM注销自己.