1、HDFS篇
1.1 元数据解刨
1、由客户端请求DistributedFileSystem对DSFClient进行NameNode(RPC)的请求。 2、NameNode下的NameNodeRpcServer接收请求后并让FSNameSystem进行FSDirectory和EditLog的写入,首先FSDirectory会根据客户端的请求在INodeDirectory下创建对应的INodeFile,而EditLog会写入两份元数据,一份写JournalNode,另一份通过EditLogFileOutputStream流双缓存机制落入磁盘。写JournalNode元数据会申请一个QuorumOutputStream流双缓存机制把元数据写入AsyncLoggerSet中,每个AsyncLogger通过异步的方式写入到对应的JournalNode节点上。每个JournalNode里都会有个JournalNodeRpcServer的服务通过Journal的方法将元数据写入磁盘。 3、在JournalNode里还有个名为JournalNodeHttpServer的服务,走HTTP的请求将元数据同步到NameNoede的standBy的FSEditLogLoader加载器中。在加载的过程中EditLogTailer会每隔60秒写到FSIgmage中并传入到FSEditLogLoader加载器中,在通过HTTP的请求传给JournalNodeHttpServer,另一部分通过FSDirMkdirOp创建对应的目录树。在同步过程中StandByCheckPoint会进行每隔60秒检查一次,是否有超过100w条日志没有CheckPoint了,还是已经超过了1个小时没有CheckPoint了,并执行相应的CheckPoint的操作写入FSImage中。4、TransFerFsImage创建输入流写入到磁盘元数据中,同时走HTTP请求将FSImage反馈到NameNodeHttpServer中,并通过ImageServlet落入磁盘文件中。 5、这里中的NameNode的standBy每隔几秒就会回来同步日志,CheckPoint的操作会合并元数据,合并出来的fsimage文件,再把这个文件通过HTTP请求上传到活跃的NameNode中。
1.2 NameNode启动流程解刨
1、NameNode启动之前FSNamesystem会合并fsimage和editlog到内存中,在FSNamesystem中有3个重要的角色,分别是BlockManager(数据块管理者)、LeaseManager(契约管理者)、SafaModeInfo(安全模式管理者)其中BlockManager和LeaseManager会计算出来Block的个数阀值,用于判断是否小于阀值从而是否进入安全模式(是为进入)。SafeModeInfo会判断存活的DataNode的个数(默认为0)是否进入安全模式(是为进入)。 2、FSNamesystem通过NameNodeResourChecker检查各种目录(存元数据)是否小于100M,是则将hasResourcesAvailable标识为false,反之标识为true。hasResourcesAvailable为true的时候会判断磁盘空间是否大于100M。并是否进入安全模式(是为进入)。 2、此时NameNode和DataNode会通过NameNodeRpcServer中的ServiceRpcserver协议进行相应的操作流程,而客户端会操作NameNodeRpcServer中的ClientRpcServer协议进行相应的操作流程。
1.3 DataNode启动流程并注册解刨
1、DataNode启动的时候会加载BPOfferService并激活BPServiceAcotr使得bpNamenode这个类(获取NameNode的Rpc代理)。 2、第一步bpNamenode通过代理执行NameNodeRpcServer中的versionRequest方法进行注册DataNode的信息给NameSystem。BPServiceActor通过调用bpNamenode的registerDataNode协议注册DataNode的信息。 3、最后NameNodeRpcServer会把注册信息通过NameSystem的DataNodeManager进行相应操作,并在DataNoeManager里的各种内存结构存入DataNode的信息,最后DataNodeManger会让DataNode的信息存入到HeatbeatManager中。
1.4 HDFS文件上传解刨
1、客户端发出上传文件的请求,通过DistributedFileSystem创建DFSClient并通过NameNodeRpcServer代理进行提交文件信息。同时通过LeaseRenewer每隔30秒续约一次。 2、DistributedFileSystem会创建DFSOutputStream流将文件封装成多个chunk校验文件(这里规定一个chunk为512+4byte),进入packet中(64k)每个chunk都会有个checksum描述信息,将packet加入到dataQueue队列中。则另一边同时进行会创建DataStreamer,一方面会通过NameNodeRpcServer的RPC协议申请block。 3、而DataStream会通过ResponseProcess申请ackQueue,这里的ackQueue其实装的是数据,是dataQueue开始加载的数据。如果ackQueue取出的数据和dataQueue取出来的数据一致就删除表示为已经成功,如果ackQueue取出来的数据不一致就会让数据重新加入到dataQueue头部进行重试。 4、此时FSNamesystem也会创建对应的目录树结构,对其添加契约信息,在LeaseManager后台会启动一个线程监控契约的可排序数据结构,每隔2秒会判断契约是否过期或者是否超过一个小时都会释放契约。在BlockManager中通过blockMap的数据结构生成对应的block、BlockPlacementPolicy通过目标机器也会创建block然后发送给INodeFile进行创建。生成了LocatedBlock让DataStream进行获取block。 5、DataStream判断之前的packet没有失误的话,就会发送到下游的DataNode中。每一个DataNode通过DataXceiverServer的DataXceiver将Block写入到BlockReceiver进行处理。BlockReceiver接收数据的时候会把packet写到ackQueue把这个packet发送到下游的DataNode节点,另一方面则会把数据写入磁盘中。而BlockReceiver会吧数据抽象出一个FSColume对象,主要为数据块分配存储空间。依次往下游写入packet然后依次反馈packet处理结果是否下游都写完成功。
2、Yarn篇
2.1 MapReduce On YARN解刨
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注销并关闭自己。
2.2 ApplicationMaster解刨
ApplictionMaster 管理部分主要由三个服务构成,分别是 ApplicationMasterLauncher、AMLivelinessMonitor 和 ApplicationMasterService,它们共同管理应用程序的 Application-Master 的生存周期。
1、ApplicationMasterLauncher:ApplicationMasterLauncher既是一个服务,也是一个事件处理器,它处理AMLauncherEvent类型的事件,该类型事件有两种,分别是请求启动一个ApplicationMaster的"LAUNCH" 事件和请求清理一个ApplicationMaster的"CLEANUP"事件。ApplicationMasterLauncher维护了一个线程池,从而能够尽快地处理这两种事件。 2、AMLivelinessMonitor:该服务周期性遍历所有应用程序的ApplicationMaster,如果一个ApplicationMaster在一定时间(可通过参数yarn.am.liveness-monitor.expiry-interval-ms配置,默认为10min)内未汇报心跳信息,则认为它死掉了,它上面所有正在运行的Container将被置为运行失败。 3、ApplicationMasterService:ApplicationMasterService实现了RPC协议 ApplicationMasterProtocol,负责处理来自ApplicationMaster的请求,请求主要包括注册、心跳和清理三种。 步骤1:用户向YARN ResourceManager提交应用程序,ResourceManager收到提交请求后,先向资源调度器申请用以启动 ApplicationMaster的资源,待申请到资源后,再由ApplicationMasterLauncher与对应的NodeManager通信,从而启动应用程序的ApplicationMaster。 步骤2:ApplicationMaster启动完成后,ApplicationMasterLauncher会通过事件的形式,将刚刚启动的ApplicationMaster 注册到AMLivelinessMonitor,以启动心跳监控。 步骤3:ApplicationMaster启动后,先向ApplicationMasterService注册,并将自己所在host、端口号等信息汇报给它。 步骤4:ApplicationMaster运行过程中,周期性地向ApplicationMasterService汇报"心跳"信息("心跳"信息中包含想要申请的资源描述)。 步骤5:ApplicationMasterService 每次收到ApplicationMaster的心跳信息后,将通知AMLivelinessMonitor更新该应用程序的最近汇报心跳的时间。 步骤6:当应用程序运行完成后,ApplicationMaster 向ApplicationMasterService发送请求,注销自己。 步骤7:ApplicationMasterService 收到注销请求后,标注应用程序运行状态为完成,同时通知AMLivelinessMonitor移除对它的心跳监控。