MapReduce原理
问题1. 什么是计算, 什么是分布式计算?
答案: 计算指的是从海量数据中提取出有效的价值信息的过程(广义上解释), 狭义上指的是 1 + 1 = 2 即: 数学运算. 分布式计算指的是 多台机器协调, 共同完成同1个计算任务.
问题2: 分布式计算的两种模式?
答案: 分散汇总模式: 大家各自做各自的, 最后交由主节点汇总. 例如: MR程序就属于这种. 中心化模式, 步骤执行: 由老大(主节点)统筹安排各机器的计算任务, 第一步, 第二步等..., 最后将结果交由主节点汇总.
问题3: 那么是不是所有的场景都适合用分而治之呢?
我们知道MR是一种分布式计算架构, 采用的是 分而治之 的思想,
答案: 不一定, 看需求, 如果把大任务拆分成n个小任务之后, 小任务之间的依赖度比较高的情况下, 就不适合用分而治之思想. 例如: 求平均数.(1-7所有数的和,如1+2 交给一台机器,2+3交给一台机器,最后汇总求平均会变成4.3333,而1+2+...+7=28/7=4)
问题4: 请简述MR的核心八步?
答案:
定义输入组件, 负责读取数据源. 逐行读取.
自定义MapTask任务, 负责 分.
分区.
排序.
规约.
分组.
自定义ReduceTask任务, 负责 合.
定义输出组件, 将结果写到目的地文件中.
MR核心8步:
1.定义输入组件,负责读取源文件,获得K1, V1 K1:行偏移量,表示从哪开始读,V1:整行数据.
2.自定义MapTask任务,负责拆分的动作,获得K2, V2
1个切片= 1个MapTask任务, 切片大小默认和Block块大小-致. K2:单词,V2: 单 词的次数,默认记录为1.
3.分区,给数据打标记的,标记将来被哪个ReduceTask任务处理。
4.排序,默认按照字典顺序,按照K2进行升序排列.
5.规约,对MapTask端的数据做局部合并的,降低Reduce拉取的数据量,
6.分组,默认按照K2进行分组,K2一致的数据,会被放到一起。
7.自定义ReduceTask任务,负责合并的动作,获得K3, V3
1个分区= 1个ReduceTask任务, K3:单词,V3:单词总数.
8.定义输出组件,将结果写到目的地文件中。
问题5: 请简述MR程序的执行流程?
提示 1,切片,MapTask
2,MapTask扫描,放入环形缓冲区
3,满则溢,分排规,存磁盘
4,小文件合并
5,ReduceTask拷贝数据
6,ReduceTask对数据进行合并,排序
7,ReduceTask写磁盘
答案:
-
MR程序分为MapTask阶段 和 ReduceTask阶段, 且: 1个切片 = 1个Block块 = 1个MapTask任务 = 1个分好区, 排好序, 规好约的文件. 1个分区 = 1个ReduceTask任务 = 1个结果文件.
-
先对文件
切片
, 每个片的大小默认和Block块大小一致(即: 128MB), 且每个切片的数据会交由1个MapTask任务来处理. -
MapTask任务采用
逐行的方式从切片中读取数据
, 逐行处理, 且会将处理后的数据放到环形缓冲区
(默认大小:100MB, 溢写比:0.8) -
当环形缓冲满(80MB)的时候, 会
触发溢写线程(spill)
, 对该部分数据做分区, 排序, 规约
的操作, 然后存储到磁盘上
(小文件) -
对上述的
小文件进行合并
(默认: 10个一合并), 获取最终的文件, 即: 1个MapTask = 1个分好区, 排好序, 规好约的文件. -
当MapTask任务执行结束后, ReduceTask会开启1个拷贝线程, 从各个MapTask的结果文件中,
拷贝属于自己的数据
(根据分区编号识别). -
ReduceTask对数据进行合并, 排序
的操作, 获取最终结果数据. -
ReduceTask将处理好的结果数据写到磁盘文件
中, 1个ReduceTask = 1个结果文件, 至此, MR程序执行结束.
Yarn原理
问题1: 什么是资源?
答案: 资源指的是硬件资源, 例如: CPU, 内存, 磁盘, 声卡, 网卡, 显卡...
问题2: 什么是调度, 目的是什么?
答案: 调度指的是当程序执行的时候, 所需资源有我们来集中管理分配, 目的是: 提高资源利用率.
问题3: 我们知道Yarn是大数据分布式集群 统一任务接收 和 资源调度器, 怎么理解统一呢?
答案: Yarn是负责调度计算任务的, 至于计算任务是什么, Yarn根本就不关心, 只要符合Yarn规范即可. 即: 无论是MapReduce计算任务, Spark计算任务, Flink计算任务, Yarn都能调度.
问题4: Yarn架构角色介绍 及 功能?
答案: Yarn属于大数据分布式集群统一任务接收和资源调度器, 由ResourceManager 和 NodeManager两种角色组成. ResourceManager作用:
-
负责管理整个集群的资源.
-
负责任务的接收.
-
负责资源的调度 和 分配.
NodeManager作用:
-
管理本机的资源.
-
负责具体任务的执行. 所谓的管理资源, 其实就是开辟容器空间, 也叫: 资源空间, 资源容器(Container).
问题5: 请简述Yarn调度MR程序的流程? 也可能问: Yarn调度job(计算任务)流程.
流程如下:
1.客户端提交计算任务(例如:MR任务,Spark任务, Flink任 务等)给到Resour ceManager.
-
ResourceManager校验任务合法后,会找一台nodemanager节点,创建AppMaster进程. 细节: 1个计算任务= 1个AppMaster进程。
-
ApMaster进程会和Resour ceManager建立心跳机制,并通过心跳包的方式获取到要执行的计算任务的信息,之后会计算执行该任务所需的资源。
-
AppMaster找Resour ceManager申请执行该计算任务所需的资源.
-
Resour celManager接收到AppMaster的请求后,会找一些nodemanager,在其上创建一些Container资源容器, ”占用"资源,用于执行该计算任务,
-
AppMaster会连接到nodemanager,从而找到这些Container资源容器.
-
AppMaster会让计算任务在Container资源容器中执行,并实时监听它们(计算任务) 的状态,当MapTask任 务执行结束后,AppMaster 会通知ReduceTask开始执行,当ReduceTask执行结束后,整个计算任务就做完了。
-
AppMaster会将该计算任务的结果返回给ResourceManager,并通知ResourceManager可以释放该计算任务的Container資源了,并启动自毁,至此,整个流程结束。
关键词: 请求,AppMaster,心跳,申请资源,Container资源容器, 实时监听,返回,自毁
问题6: 请简述你对Yarn的三种调度策略的理解?
答案: FIFO Scheduler:
先进先出调度器, 类似于: 单车道, 目前几乎不用. 优点: 每个计算任务都独享集群 100%的资源. 缺点: 当小任务前有大任务在执行时, 小任务可能迟迟无法执行结束, 必须等待大任务执行完毕.
Capacity Scheduler
: 容量调度器, 类似于: 多车道. Apache Hadoop(社区版)默认用的调度策略. 优点:
-
支持多任务并行执行.
-
且支持资源借调. 缺点:
-
可能存在资源无法归还的情况.
-
存在资源浪费的情况, 即: 任务无法独享集群100%的资源.
Fair Scheduler
: 公平调度器, 类似于: 潮汐车道.最早是由FaceBook研发的, 后续我们要用的 商业版Hadoop, Yarn的调度策略就是这一种. 优点:
-
支持多任务并行执行.
-
且支持资源借调. 当有第1个任务执行的时候, 它独占集群100%的资源, 当有第2个任务执行的时候, 它(第1个任务)会分一半的资源给到第2个任务. 第有第3个任务执行的时候, 会再分一半的资源出去, 即: 三个任务的资源使用率都是 33.333%... 缺点: 当有大量小任务执行的时候, 存在大任务迟迟无法执行结束的情况.