(一)高并发网络通信RPC架构设计
1. YARN结构演进
- Hadoop-2.x版本之后,解决了原来JobTracker容易出现单点故障以及主节点承载压力大,容易出现性能瓶颈(ApplicationMaster分布在各NodeManager上)的问题。
- 资源管理/调度和任务执行解耦合(Yarn)。
- ApplicationMaster只是一个规范,可支持多种分布式计算框架如Spark、Flink、Storm。
- NodeManeger中的container资源抽象比TaskTracker的slot更合理,提高资源利用率。
2. Hadoop RPC架构实现
- 第一个阶段:Server 初始化和启动
- 第二个阶段:接收请求,封装 RpcCall
- 第三个阶段:处理 RpcCall 请求
- 第四个阶段:返回结果
其实这个地方讲的就是一个RpcServer,RpcServer并不是一台服务器,事实上,一台硬件服务器之上是可以运行多个RpcServer的。
NameNode(多个RpcServer)
第一个RpcServer:给client提供服务
第二个RpcServer:给DataNode提供服务
ResourceManager(多个RpcServer)
第一个RpcServer:给client提供服务
第二个RpcServer:给NodeManager提供服务
3. RPC支持高并发的调优
Listener和Responder是单线程运行的。而Hadoop RPC支持高并发的核心在于Reader线程和Handler线程可以开多个,默认是1个Reader,10个Handler,可以根据自己实际的生产环境进行调整以达到最佳性能产出。
(二)YARN内核架构三大核心组件
YARN的核心设计理念是服务化Service和事件驱动AsyncDispatcher(Event + EventHandler/StateMachine)。服务化和事件驱动软件设计的思想引入,使得YARN具有低耦合、高内聚的特点,各个模块只需完成各自功能,而模块之间则采用事件联系起来。
1. Service工作机制
- 将每个被服务化的对象分为 4 个状态:NOTINITED(被创建)、INITED(已初始化)、STARTED(已启动)、STOPPED(已停止)。
- 任何服务状态变化都可以触发另外一些动作。
- 可通过组合的方式对任意服务进行组合,以便进行统一管理。
2. AsyncDispatcher异步驱动模型
3. StateMachine状态机设计
public void handle(JobEvent event) {
// 获取状态机当前状态
JobStateInternal oldState = getInternalState();
// 调用状态机,执行状态转移,也可以认为就是在处理一个事件
getStateMachine().doTransition(event.getType(), event);
}
(三)YARN Application提交和部署全流程详解
1. YARN Application提交和部署流程
- 步骤 1:ApplicationClientProtocol.submitApplication
- 步骤 2:ContainerManagementProtocol.startContainers,启动AM的命令行:java MRAppMaster
- 步骤 3:launch ApplicationMaster
- 步骤 4:ApplicationMasterProtocol.registerApplicationMaster
- 步骤 5:ApplicationMasterProtocol.allocate
- 步骤 6:ContainerManagementProtocol.startContainers,启动任务的命令行:java YarnChild
- 步骤 7:launch Task/YarnChild
- 步骤 8:heartbeat
- 步骤 9:ApplicationMasterProtocol.finishApplicationMaster
YARN的通信机制采用双主从架构:
【全局】ResourceMananger(ApplicationsManager)和NodeManager(ApplicationMaster),【应用程序级别】ApplicationMaster和各YarnChild节点(执行MapTask和ReduceTask)
简化版概括:
(1)Client 向 Yarn 提交一个应用程序,接着 ResourceManager 就会响应用户的请求;
(2)ResourceManager 开启一个 Container,在 Container 中运行一个 ApplicationManager,然后 ApplicationManager 为该应用分配第一个 Container,并选取一个 NodeManager 进行通信,并要求此 NodeManager 在这个 Container 中启动应用程序的 ApplicationMaster;
(3)ApplicationMaster 向 ResourceManager 注册,并向 ResourceManager 申请运行应用程序所需的系统资源;
(4)Scheduler 将资源封装好发送给 ApplicationMaster;
(5)ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动 Container,各个 NodeManager 分配完成资源后,就开始在 Container 中执行 Map task、Reduce task 等具体任务;
(6)各个任务通过 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以此方式让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
(7)ApplicationMaster 将任务执行结果返回给 ApplicationManager,并在应用程序运行完成后向 ApplicationManager 注销并关闭自己。
2. Application的生命周期