1>客户端与hdfs文件系统的交互问题
a:读流程: 1>client调用distributeFileSystem的Api的open方法,与Namenode建立通信,请求读取一个制定路径下的文件,此时NameNode会去查合并的编辑日志和镜像文件,以及会根据Namenode和Datanode之间的心跳报告,得知该数据的健康性,和完整性.,如果该文件已经损坏,则返回异常
2>当数据是健康的状态,Namenode会返回给客户端该数据存储在哪个对应的Datanode上
3>client得到数据的基本信息(存储位置信息)并调用FSDataputstram api与对应的Datanode建立对应的流数据传输通道,数据以packet(64kb)进行数据的传输,先在本地进行缓存,在传输到目标位置
b:写流程:1>chient调用distributeFileSystem的api的create方法,与Namenode进行通信,并请求上传文件,以及文件的元数据信息
2>Namenode拿到文件的元数据信息(主要是文件路径),Nomenode会读取编辑日志文件和镜像文件去查看该hdfs目录下是否已经存在该文件,如何存在返回,如果不存在
3>在该文件不存在的情况下 ,Namenode会根据自己切分算法。将数据切分为多个块block(128m,逻辑上的切分),并选择合适的Datanode存放数据节点返回给client
4>client调用FsInputStream的write方法,首先将一个block写道对应的datanode上
5>由已知上传的数据块,开启另一一个新的线程,进行副本的存放策略
策略:第一个副本考虑与client最接近的机器(提高读取性能,基于性能考虑)
第二个副本,跨机器存放该副本(考虑数据的安全性.可靠性策略)
第三个副本,与第一个,第二个副本都不在同一个机架上(基于数据安全性考虑)