1 MapReduce的执行流程!
分布式计算常见的两种模式:
分散汇总模式: 单个MapReduce任务就是分散汇总模式
中心调度分步执行模式: 多个MapReduce迭代计算并汇总模式
MapReduce的阶段划分
shuffle 阶段是从map阶段输出数据开始,到reduce阶段输入数据为止
1. 我们的MapReduce任务中有几个Maptask是由什么决定的呢??
开启任务后会根据split size 将文件拆分为多个部分放入maptask任务中, 默认情况下 split size 的大小和block size相同,所以有多少个bolck块就会产生多少个maptask任务.
2. 我们的map任务的数据结果会有多少个分区呢?
有多少个reducetask ,maptask中就会产生多少个分区
maptask先执行,那我们如何直到reducetask有几个呢?
在mr任务执行之前,先要制定执行计划, 这个叫做job
3. MapReduce任务执行完成后,会写入磁盘多少个数据文件呢?
有多少个reducetask,最终就会产生多少个文件,多个reducetask不能写入同一个文件中,但是可以迭代写入(多个MapReduce,一个写完另一个再写)
4. MapReduce计算引擎的缺点是什么?
在MapReduce计算过程中,多次进行了内存和磁盘的交互,所以计算效率较低,速度较慢
如果将中间结果全部基于内存存储,此时效率就会大大提高,这就算
5. MapReduce是一个失败的产品么?
1.频繁落盘可以在每一步都持久化保存数据,如果计算失败将会重新立即计算,安全性可靠性高
2.在磁盘中存储数据对于服务器性能不高,在大数据发展初期,计算机性能不佳,MR极大程度上解决了穷的问题
3.开辟了分布式的计算先河,现有的分布式计算框架基本上都是分而治之的思想,以及MapReduce的逻辑架构
6. MapReduce一共分为几个阶段?
- map阶段
- shuffle阶段
- **shuffle是mr的核心,**成败都在于shuffle
- shuffle阶段让程序员将精力全部放在业务代码上,不需要关注计算过程.大大降低了分布式计算的开发门槛,提高了开发效率
- shuffle阶段中频繁在内存和磁盘中进行数据交互,大大降低了计算效率
- reduce阶段
7. shuffle阶段做了什么事情?
100分答案:
Collect阶段: 将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等(将key计算处hash值,根据哈希取余计算分区)
Spill阶段:当内存中的数据量达到一定的阀值(80%)的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序
Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件
Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上
Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。
80分答案: 分区, 排序, 合并
什么情况下需要配置combiner ??
reduce压力较大,或者有数据倾斜问题.
我们的任务执行顺序是先执行map任务,后执行reduce任务,为什么map的分区数,可以和reduce任务数量相同???
执行MapReduce任务之前先进行任务计划,生成job文件
job文件提交给ResourceManager,申请容器
我们此时就会将需要多少个map任务和多少个reduce任务规划好,并申请相对应的容器数量.
2 Yarn执行MapReduce的流程!
Yarn的角色分配
主角色: ResourceManager 负责资源的分配
从角色: NodeManager 负责资源的统计汇报和使用
**Yarn中的容器机制: **
- Yarn会将服务器中的资源大小不同的多个部分,称为容器
- Yarn中的容器机制其实就是在服务器中预先占用一部分内存和cpu资源,等待程序的运行
- 容器的管理和使用是由NodeManager完成的,但是会将容器信息汇报给ResourceManager,由其统一分配
- 容器中运行的程序无法突破容器的限制,使用容器限定资源之外的资源.
举例: 有三个容器 容器1 : 1G 容器2 : 2G 容器3: 4G
- 有一个任务需要申请200kb的计算资源,此时我们使用容器几??? 容器1
- 有一个任务需要申请3.5G的计算资源,此时我们使用容器几??? 容器3. 有一个任务需要申请6G计算资源,此时我们需要使用功能容器几??? 容器2 + 容器3
注意: 容器可以随时进行合并,但是拆分需要重新规划容器
1. ApplicationMaster 做了哪些事情??
1.想ResourceManager注册自己并保持心跳
2.根据自身任务的需求,向 ResourceManager申请计算资源(容器:内存、CPU)
3.获取资源后,与对应的NodeManager建立连接保持心跳
4.待NodeManager开辟并启动容器后,将任务代码分发到每一个容器内部,并让NodeManager执行任务
5.任务启动后,监控任务的执行进度和执行状态
6.向client汇报当前任务的进度
7.任务执行完成后,向ResouceManager注销自己,并回收容器
2. 为什么Yarn能够作为公共分布式资源调度平台? 为什么Yarn可以兼容各种的计算框架?
- Yarn只负责资源分配,不处理任务执行,所以任务执行流程,原理,使用的方式方法和yarn没有任何关系
- 只要满足Yarn申请资源的逻辑,就可以获取内存和cpu资源
- 计算任务中,必须有创建ApplicationMaster的代码,后续的计算流程完全由ApplicationMaster负责
举例:
公司招聘, 老板只负责分配公司的资源, 让各个员工做事,这个老板可以从事任何行业
如果老板负责安排工作和公司资源分配,此时老板只能做自己会的事情
- 计算任务中,必须有创建ApplicationMaster的代码,后续的计算流程完全由ApplicationMaster负责
3. Yarn执行mr任务时,ResourceManager做了什么事情?
- 分配资源创建并执行ApplicationMaster
- 与ApplicationMaster保持心跳
- 根据ApplicationMaster的资源请求,分配对应的内存和cpu资源
- 注销ApplicationMaster之后回收容器
本质上就做了两件事 : 分配资源 回收资源
3 Yarn的三大调度策略(理解优势)
先进先出调度器: 先进入调度器的任务先执行,占用全部的资源其他任务等待
公平调度器: 所有的任务平分资源,当任务执行完成后,将资源释放平分给正在执行的其他任务
容量调度器: 将资源分为多份,每份的资源比例不变,任务只能使用当前队列的资源不能使用全部资源
哪种调度策略更好呢?
先进先出肯定不好
公平调度,资源利用率最高,大任务的执行效率最高,但是不同部门之间开发时会抢占对方的计算资源
容量调度,不同部门分配不同的计算资源队列,互不影响,但是大任务执行时始终无法使用全部集群资源
没有最好的调度策略,根据不同的业务场景进行选择
Apache版本hadoop 默认的调度策略是容量调度
CDH版本hadoop 默认的调度策略是公平调度
打开8088端口,查看web页面上边书写了调度器类型:默认Capacity Scheduler容量调度器