MapReduce之Job提交流程
1. 准备阶段
运行Job.waitForCompletion()
,先使用JobSubmitter
提交Job,在提交之前,会在Job的作业目录中生成以下文件:
job.split
:当前Job的切片信息,有几个切片对象
job.splitmetainfo
:切片对象的属性信息
job.xml
:job所有的属性配置
2. 提交阶段
本地模式
LocalJobRunner
进行提交,如果是HDFS,使用了yarn,则是YARNJobRunner
创建一个LocalJobRunner.Job()
job启动:Job.start()
Map阶段
- 采用线程池提交多个MapTaskRunable线程
- 每个MapTaskRunable线程上,实例化一个
MapTask
对象 - 每个MapTask对象,最终实例化一个
Mapper
Mapper.run()
- 线程运行结束,会在线程的作业目录中生成 file.out文件,保存MapTask输出的所有的
key-value
MapTaskRunable------>MapTask--------->Mapper--------->Mapper.run()------->Mapper.map()
阶段定义
如果有ReduceTask,MapTask运行期间,分为 map(67%)---sort(33%) 两部分
如果没有ReduceTask,MapTask运行期间,只有map(100%)
map: 使用RecordReader
将切片中的数据读入到Mapper.map(),直至写出:context.write(key,value)
Reduce阶段
- 采用线程池提交多个ReduceTaskRunable线程
- 每个ReduceTaskRunable线程上,实例化一个
ReduceTask
对象 - 每个ReduceTask对象,实例化一个
Reducer
- reducer.run()
- 线程运行结束,会在输出目录中生成
part-r-000x
文件,保存ReduceTask输出的所有的key-value
,即最后结果
ReduceTaskRunable------->ReduceTask------>Reducer----->Reducer.run()------>Reducer.reduce()
阶段定义
- copy:使用
shuffle
线程拷贝MapTask指定分区的数据 - sort:将拷贝的所有的分区的数据汇总后,排序
- reduce:对排好序的数据,进行合并
- Shuffle的含义为洗牌,将Map阶段写出的数据,进行洗牌(将数据整理的有序,方便Reducer进行reduce)! Shuffle阶段横跨MapTask和RedcueTask,在MapTask端也有Shuffle,在RedcueTask也有Shuffle! 具体Shuffle阶段指MapTask的map之后到RedcuceTask的reduce之前!
YARN上运行 在提交Job后,创建MRAppMaster进程!
由MRAppMaster,和RM申请,申请启动多个MapTask,多个ReduceTask
Container------>MapTask--------->Mapper--------->Mapper.run()------->Mapper.map() Container------->ReduceTask------>Reducer----->Reducer.run()------>Reducer.reduce()
- 两个四字母域名均以五位数被交易
- Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object)
- Android Fragment完全解析
- Centos下堡垒机Jumpserver V3.0环境部署完整记录(2)-配置篇
- Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室
- 28家银行用户体验调研报告:洞见银行业的“进化论”
- 性能计数器数据收集服务
- SQL SERVER 内存分配及常见内存问题 DMV查询
- 6 利用Docker .NET应用程序模板制作您的容器应用程序(第2部分)
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)
- git review报错一例
- Nginx采用https加密访问后出现的问题
- 对比git rm和rm的使用区别
- Gerrit日常操作命令收集
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 教你CentOS7下如何更换内核安装BBR加速
- we-extract解析和采集微信公众号文章的账号及内容必备工具
- android九宫格可分页加载控件使用详解
- WordPress用插件实现MarkDown语法支持
- Android中实现长按照片弹出右键菜单功能的实例代码
- Android Studio无法执行Java类的main方法问题及解决方法
- PlayTube优秀的视频CMS系统/支持本地和youtube导入
- Android Studio 中运行 groovy 程序的方法图文详解
- android studio按钮监听的5种方法实例详解
- AndroidStudio3.6.1打包jar及AndroidStudio4.0打包jar的一系列问题及用法
- 教你如何在js中split函数分割字符串为数组
- [折腾]小型HTTP web服务Caddy及配置PHP
- graftcp一种把指定程序的 TCP 流量重定向到代理的方法
- Flutter应用集成极光推送的实现示例
- android调用C语言实现内存的读取与修改的方法示例