1.MRv1的几个缺陷
扩展性受限
单点故障
难以支持MR(离线计算框架)之外的计算,如Storm(实时计算框架)、Spark(内存计算框架)
2.Resource Manager
整个集群通常只有一个(HA可两个),负责集群资源的统一管理和分配
处理客户端请求
负责启动和监控ApplicationMaster,并在失败时重启AM
监控NodeManager
对系统总资源进行管理与分配
3.NodeManager
集群中多个,负责单节点资源管理和使用
负责单个节点上的资源管理和任务管理
定时向RM汇报本节点上的资源使用情况以及各个Container的运行状态
处理来自ApplicationMaster的请求
4.ApplicationMaster
每个应用程序只有一个,负责应用程序的管理
将任务分配成更多的内部任务
向RM申请与领取资源
与NM通信以启动/停止内部任务
负责监控应用的执行状态
负责重新启动执行失败任务
5.Container
对任务运行环境的抽象
描述一系列信息:
任务运行资源(节点,内存,cpu)
任务启动命令
任务运行环境
6.Yarn运行过程:
1.client向RM提交任务
2.RM告知某个NM在某个Container上启动AM
3.AM向RM注册,以便RM管理
4.AM向RM申请和领取资源
5.AM判断使用什么计算框架,根据申请的资源分配Container,与NM通信要求启动task,如mapreduce框架中启动map task、reduce task
6.NM在分配的Container上启动task
7.AM通过RPC协议监控与管理task
8.执行完成后,AM向RM注销并关闭
7.Yarn容错性:
RM:存在单点故障(基于zookeeper实现HA)
NM:失败后,RM将失败任务告知对应的AM,AM决定如何处理失败的任务
AM:失败后,由RM负责重启,AM需处理内部任务的容错问题,AM会保存已运行完成的task,重启后无需重新启动
8.Yarn中的资源隔离
支持内存与CPU两种资源隔离
内存隔离:
基于线程监控的方案
基于Cgroups的方案
CPU隔离:
默认不对CPU进行隔离
基于Cgroups的方案
10.Yarn上的几种计算框架
离线计算框架:Mapreduce
DAG计算框架:Tez 多个作业之间存在数据依赖关系,并形成一个依赖关系有向图
流式计算框架:Storm
内存计算框架:Spark
11.MapReduce的几个特点:
易编程,良好的扩展性,高容错性
适合海量数据的离线处理
12.MapReduce应用场景:
简单的数据统计、搜索引擎建索引、海量数据查找、复杂数据分析算法实现
13.MapReduce的主要几个过程
Input->splitting->mapping->shuffling->reducing->output
14.map阶段
由一定数量的Map Task组成,而 Map Task通常包括input,splitting,mapping及shuffling的一部分
spliting阶段:从HDFS的中输入数据,将各block对应成map task可读取的split(mapreduce中最小的计算单元,默认与block一一对应,可修改)。
mapping阶段:对输入的split进行格式解析(InputFormat),解析成key/value对(key是行在文件中的偏移量,value是行内容)。
一部分shuffling:
通过MapReduce提供的Partitioner接口,决定map task输出的每条数据交给哪个reduce task处理,默认通过hash(key) mod R实现,用户可以根据需求自定义map task将生成的key/value对以及partition写入内存缓冲区
通常我们在配置文件中设置缓冲区大小buffer size,同时设置一个溢写spill percent,当缓冲区的数据超过buffer size*spill percent时,启动一个spill线程这一部分数据写入磁盘中,溢写前先按key对其排序。并且可以同步地向buffer写入数据(剩余buffer size*(1-spill percent))
如果设置了combiner(本机reducer),在spill到磁盘之前,运行combiner函数去合并相同的key对应的value,可以减少map task输出数据量(磁盘IO)及减少map->reduce网络传输数据量(网络IO)。hadoop文档中说明即使设置了combiner,也有可能不被执行
每次溢写只能生成一个buffer size*spill percent的文件,map的结果通常由多个spill文件组成。系统使用merge函数对多个spill文件按key合并成一个文件,key/value变成key/group。
15.reduce阶段
由一定数量的Reduce Task组成,每个reduce task包括一部分shuffling,reducing,output组成
一部分shuffling:
每个reduce task启动溢写数据copy线程(Fetcher)远程拷贝各个map task的最终溢出文件(保存在硬盘上)对应的数据。
采用同map task中merge同样的过程,数据来源于不同的map task,不断对copy过来的数据进行merge,最终形成一个文件(可能保存在内存中,也可能保存在磁盘中)
reducing:对merger后的最终文件进行数据处理reduce,执行编写的reduce函数,将结果写入HDFS中
16. mapreduce 2.XX配置文件/etc/hadoop/mapred-site.xml的几个主要参数
mapreduce.framework.name #yarn
mapreduce.jobtracker.http.address #master:50030
mapreduce.jobtracker.address #master:9001
mapreduce.jobhistory.address #JobHistory Server地址 master:10020
mapreduce.jobhistory.webapp.address #JobHistory Server Web界面地址 master:19888
mapreduce.map.sort.spill.percent #内存缓冲区溢出阀值 0.8
mapreduce.task.io.sort.mb #内存缓冲区大小 100
17. 数据本地性
任务运行在它将处理的数据所在的节点,则该任务具有“数据本地性”
18. 推测执行机制:
作业完成时间取决于最慢的任务完成时间,任务处理速度慢的任务,启动一个备用任务同时任务,谁先运行完,则采用谁的结果
任务间存在严重的负载倾斜,不能启用
特殊任务,比如向数据中心写数据,不能启动
19. mapreduce三种编程方式:
java:最原始的方式
hadoop streaming :支持多语言(shell、python等)
hadoop pipes:支持c/c++