3.HDFS Client收到响应后,将文件写入第一个DataNode中,第一个DataNode接收到数据后将其写入本地磁盘,同时把数据传递给第二个DataNode,直到写入备份数个DataNode。
4.每个DataNode接收完数据后都会向前一个DataNode返回写入成功的响应,最终第一个DataNode将返回HDFS Client客户端写入成功的响应。
5.当HDFS Client接收到整个DataNodes的确认请求后会向NameNode发送最终确认请求,此时NameNode才会提交文件。
*当写入某个DataNode失败时,数据会继续写入其他的DataNode,NameNode会重新寻找DataNode继续复制,以保证数据的可靠性。
*每个Block都会有一个校验码并存放在独立的文件中,以便读的时候来验证数据的完整性。
*文件写入完毕后,向NameNode发送确认请求,此时文件才可见,如果发送确认请求之前NameNode宕机,那么文件将会丢失,HDFS客户端无法进行读取。
HDFS读取文件的流程
1.HDFS Client向NameNode申请读取指定文件。
2.NameNode返回文件所有的Block以及这些Block所在的DataNodes中(包括复制节点)
3.HDFS Client根据NameNode的返回,优先从与HDFS Client同节点的DataNode中直接读取(若HDFS Client不在集群范围内则随机选择),如果从DataNode中读取失败则通过网络从复制节点中进行读取。
机架感知
分布式集群中通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群。
机架内的机器之间的网络速度通常都会高于跨机架机器之间的网络速度,并且机架之间机器的网络通信通常受到上层交换机间网络带宽的限制。
Hadoop默认没有开启机架感知功能,默认情况下每个Block都是随机分配DataNode,需要进行相关的配置,那么在NameNode启动时,会将机器与机架的对应信息保存在内存中,用于在HDFS Client申请写文件时,能够根据预先定义的机架关系合理的分配DataNode。
Hadoop机架感知默认对3个副本的存放策略为:
第1个Block副本存放在和HDFS Client所在的节点中(若HDFS Client不在集群范围内则随机选取)
第2个Block副本存放在与第一个节点不同机架下的节点中(随机选择)
第3个Block副本存放在与第2个副本所在节点的机架下的另一个节点中,如果还有更多的副本则随机存放在集群的节点中。
*使用此策略可以保证对文件的访问能够优先在本机架下找到,并且如果整个机架上发生了异常也可以在另外的机架上找到该Block的副本。
2.2 YARN
YARN是分布式资源调度框架(任务计算框架的资源调度框架),主要负责集群中的资源管理以及任务调度并且监控各个节点。
ResourceManager
1.是整个集群的资源管理者,管理并监控各个NodeManager。
2.处理客户端的任务请求。
3.启动和监控ApplicationMaster。
4.负责资源的分配以及调度。
NodeManager1.是每个节点的管理者,负责任务的执行。
2.处理来自ResourceManager的命令。
3.处理来自ApplicationMaster的命令。
ApplicationMaster
1.数据切分,用于并行计算处理。
2.计算任务所需要的资源。
3.负责任务的监控与容错。
任务运行在YARN的流程