02-MapReduce、YARN、HA习题
MapReduce
单元练习9
您的答案
1、拉取复制数据
2、拉去来的数据进行merge、sort
3、对sort后的数据按key进行分组
4、每组调用reduce进行聚合处理
5、输出数据
参考答案
第一阶段:ReduceTask会主动从MapTask复制拉取其输出的键值对。
第二阶段:把复制到Reducer本地数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。
您的答案
分而治之,是将复杂大型任务拆分成小任务分别解决后汇总的思想
MapReduce分为Map阶段和Reduce阶段,Map阶段是分,将复杂任务拆分小任务,再并行执行,有效提高效率。Reduce阶段则是将Map阶段得出的结果进行全局汇总合并
参考答案
MapReduce所包含的思想分为两步:
- Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
- Reduce负责“合”,即对map阶段的结果进行全局汇总。
您的答案
- 文件按照固定大小切片,每个分片由一个Map任务处理
- 逐行读取转为键值对
- 进一步拆分单词为键值对
- 在Map任务内部合并相同单词的计数
- 根据键的哈希值决定数据分配到哪个Reducer
- 在每个分区内按键(单词)字典序排序,为Reduce阶段合并做准备
- 每个分区生成一个有序文件
参考答案
- 第一阶段:把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。默认Split size = Block size,每一个切片由一个MapTask处理。(getSplits)
- 第二阶段:对切片中的数据按照一定的规则读取解析返回<key,value>对。默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat)
- 第三阶段:调用Mapper类中的map方法处理数据。每读取解析出来的一个<key,value> ,调用一次map方法。
- 第四阶段:按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。分区的数量就是reducetask运行的数量。
- 第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。默认根据key字典序排序。
- 第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件。
您的答案
map阶段
- 将maptask的结果收集输出到默认100MB的缓冲区
- 当内存中达到默认80%后将数据进行排序后写入磁盘(溢出)
- 把所有一处的临时文件进行合并确保一个MapTask只产生一个中间数据文件
reduce阶段 - 从MapTask节点复制属于自己的数据
- 在复制的时候会在后台进行数据合并
- 合并同时会进行数据的排序
参考答案
shuffle是Mapreduce的核心,它分布在Mapreduce的map阶段和reduce阶段。一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
-
Collect阶段:将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等。
-
Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
-
Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
-
Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
-
Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
-
Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。
您的答案
在途中标注的步骤中都涉及数据在内存和磁盘中反复传输,造成性能瓶颈
参考答案
Shuffle中频繁涉及到数据在内存、磁盘之间的多次往复,D代表磁盘,而R代表内存。
YARN
单元练习10
您的答案
yarn负责集群资源管理,当一个客户端申请资源的时候,由yarn根据申请队列给客户端创建一个新的资源容器用于这个客户端的程序执行
参考答案
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
可以把yarn理解为相当于一个分布式的操作系统平台,而mapreduce等运算程序则相当于运行于操作系统之上的应用程序,Yarn为这些程序提供运算所需的资源(内存、cpu)。
- yarn并不清楚用户提交的程序的运行机制
- yarn只提供运算资源的调度(用户程序向yarn申请资源,yarn就负责分配资源)
- yarn中的主管角色叫ResourceManager
- yarn中具体提供运算资源的角色叫NodeManager
- yarn与运行的用户程序完全解耦,意味着yarn上可以运行各种类型的分布式运算程序,比如mapreduce、storm,spark,tez ……
- spark、storm等运算框架都可以整合在yarn上运行,只要他们各自的框架中有符合yarn规范的资源请求机制即可
- yarn成为一个通用的资源调度平台.企业中以前存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享
您的答案
- ResourceManager(RM):主角色,负责整个集群的资源管理和分配,程序申请资源的入口
- NodeManager:负责每台机器上的具体资源管理,负责启动关闭容器(container)
- ApplicationMaster:在应用程序中,负责与RM和NM对接的资源管理程序,负责监视客户端程序运行开始结束以及资源使用情况并反馈给RM、NM
参考答案
- ResourceManagerYARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者,接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。
- ApplicationMaster用户提交的每个应用程序均包含一个AM。应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。
- NodeManagerYARN中的从角色,一台机器上一个,负责管理本机器上的计算资源。根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。
您的答案
- 客户端连接RM请求资源运行本次程序的AM
- RM指定NM预留资源,配合客户端启动容器到指定NM,通过和NM配合启动容器运行AM进程
- AM启动向RM注册
- NM根据切片个数,向RM申请对应容器运行MapTask
- AM更具申请的容器到各机器上与NM配合启动容器运行MapTask并监督运行情况
- AM根据ReduceTask个数申请容器运行
- MR程序执行完毕,AM向RM申请回收资源并注销自己
参考答案
- 第1步、用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster 的命令、用户程序等。
- 第2步、ResourceManager 为该应用程序分配第一个Container,并与对应的 NodeManager通信,要求它在这个 Container中启动应用程序的 ApplicationMaster。
- 第3步、ApplicationMaster 首先向 ResourceManager 注册,这样用户可以直接通过ResourceManager 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤 4~7。
- 第4步、ApplicationMaster 通过 RPC 协议向 ResourceManager 申请和领取资源。
- 第5步、一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务。
- 第6步、NodeManager 为任务设置好运行环境(包括环境变量、 JAR 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
- 第7步、各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过 RPC 向 ApplicationMaster 查询应用程序的当前运行状态。
- 第8步、应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。
您的答案
FIFO scheduler调度器YARN的三大调度策略之一,是先进先出策略,保证绝对公平,但是不适合存在大型任务的时候的共享
参考答案
FIFO Scheduler调度策略:把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler调度策略优点:无需配置、先到先得、易于执行。
FIFO Scheduler调度策略缺陷:因为是先进先出,大的应用会长时间占用所有集群资源,而导致其他应用被阻塞。
您的答案
Capacity Scheduler调度策略是默认策略,提供大程序和小程序两个队列,队列内先进先出,没大程序的时候,大程序队列就浪费了
参考答案
Capacity Scheduler调度策略:允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
Capacity Scheduler调度策略缺陷:如果给某个组织分配了大量的资源,但是此组织一直都没有任务,会造成资源的浪费,举个例子:火车站,在非暑假设置学生购票窗口。
HA
您的答案
单个节点的失效导致整个集群的服务的失效,解决办法是提前设置冗余备份节点
参考答案
单点故障:single point of failure,缩写SPOF是指系统中某一点一旦失效,就会让整个系统无法运行。
解决办法:给单点故障设置备份,形成主备架构当主挂掉,备份顶上,短暂的中断之后继续提供服务,常见的是一主一备架构,当然也可以一主多备。备份越多,容错能力越强,与此同时,冗余也越大,浪费资源。
您的答案
脑裂指联系主备节点同时认为自己处于工作状态从而控制集群的运行。
后果:
- 集群无主:都认为自己是备份角色,导致无服务
- 集群多主:都认为自己是主角色,结果导致争抢资源导致混乱
参考答案
脑裂:指当联系主备节点的"心跳线"断开时(即两个节点断开联系时),本来为一个整体、动作协调的HA系统,就分裂成为两个独立的节点。由于相互失去了联系,主备节点之间像"裂脑人"一样,使得整个集群处于混乱状态。
脑裂的严重后果:
1)集群无主:都认为对方是状态好的,自己是备份角色,后果是无服务;
2)集群多主:都认为对方是故障的,自己是主角色。相互争抢共享资源,结果会导致系统混乱,数据损坏。此外对于客户端访问也是一头雾水,找谁呢?
您的答案
1,创建两个fc节点通过zk竞选选出主备,分别标记为active和standby,并开始监视NN、操作系统和硬件健康
2,通过心跳维持与zk集群联系
3,其中active节点出问题,standby通过ssh远程强制结束active中的进程后,自己开始担任acitve节点
参考答案
ZK Failover Controller(ZKFC)是一个ZooKeeper客户端,主要职责用于监视和管理NameNode、操作系统、硬件的健康状态等。
主备切换流程如下:
1,两个ZKFC同时去zk集群注册节点Znode(临时、非序列化)谁抢注成功,谁对应的NameNode就是active。
2,没有抢注成功的ZKFC就需要注册Znode节点监听,判断Znode节点是否存在,如果Znode已经存在,则其对应的NameNonde就是Standby。
3,当Active NameNone出现故障后:
3.1,首先由Active ZKFC监听到,这时候Active ZKFC就会断开和ZK集群的链接,临时节点Znode消失。
3.2,因为还有另一个之前没抢注成功的Standby ZKFC,正在监听Znode的状态,此时StandBy ZKFC会知晓目前主节点已经挂掉。
3.3,StandBy ZKFC在接到Active NameNode出现故障后,不能立即把自己机器的StandBy NameNode切换为Active NameNode,StandBy ZKFC要先远程登录到active的那台机器上,执行“kill -9 active nn”的动作,确保之前的主节点一定挂掉。
3.4,最后StandBy ZKFC去注册Znode节点,转成将原StandBy注册转变为Active主节点。
您的答案
使用JN(Journal Node)集群实现数据存储。通常使用2n+1台JN存储共享Edits Log(编辑日志),任何修改操作在Active NN上执行,JN进行也会同步记录edits log到至少半数以上的JN中,这时候Standbu NN监测到JN里面的同步log发生了变化会读取JN里面的edits log,然后重演操作记录同步到自己的目录镜像树里
参考答案
任何修改操作在 Active NN上执行时,JournalNode进程同时也会记录edits log到至少半数以上的JN中,这时 Standby NN 监测到JN 里面的同步log发生变化了会读取JN里面的edits log,然后重演操作记录同步到自己的目录镜像树里面。