HDFS的具体读、写、删除操作流程

一、读取流程
HDFS的具体读、写、删除操作流程_第1张图片

·  1.客户端通过RPC(远程过程调用,特点:能够让客户端人员更加注重业务流程,而不是文件的发送)请求访问NameNode
NameNode查询元数据,获取到文件的存储路径,将文件的所对应全部或者部分(面对多个文件块)文件块的存储路径放入一个队列中再发送给客户端(NameNode给client返回的是内网IP,如果是自己的云主机,要去找对应的,否则无法访问。)
  2.客户端收到队列之后,一次遍历队列,读取文件块
  3.客户端从队列中获取到第一个文件块的存储位置,从中选出一个最近的DataNode(客户端到机架的网络距离的远近:响应速度的快慢)来进行读取
  4.读取完成之后校验文件块的大小是否符合,如果符合,则继续读取第二个文件块;如果不符合,通知NameNode当前文件块已经损坏,然后从其他节点重新读取当前的文件块
  5.当客户端将这个文件块全部读取完成之后,会再次访问NameNode请求下一批文件块的地址
  6.当客户端读取完所有的文件块之后,通知NameNode关闭文件
这种方式是为了提高NameNode的并发量

二、写入流程
HDFS的具体读、写、删除操作流程_第2张图片
  
  1.使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
  2.Namenode会通过元数据进行校验:检查要创建的文件是否已经存在;创建者是否有权限进行操作(用户也有不同的权限,校验放的路径有没有写的权限);路径的校验(校验路径是否存在);成功则会为文件创建一个记录,否则会让客户端抛出异常;
  3.如果校验成功,NameNode计算切块数量,分配对应的DataNode。记录元数据,将文件块的地址放入队列返回客户端。
  4.当客户端开始写入文件的时候,客户端会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。
  5.开始以pipeline(管道)的形式将packet写入所 有的replicas中。开发库把packet以流的方式写入第一个 datanode,该datanode把该packet存储之后,再将其传递给在此 pipeline中的下一个datanode,直到 后一个datanode,这种写数据的方式呈流水线的形式。(复本的创建是由HDFS完成,保证传输数据的效率)
  6.当客户端将所有的packets都写完,会给NameNode发送结束信号。Name在收到结束信号之后,将文件关闭(一次写入,多次读取,写完以后只能读,不能写)。同时返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。
  7.当客户端将所有的packets都写完之后,会给NameNode发送结束信号,NameNode在接收到结束信号之后将文件关闭,同时将文件设置为不可写入的文件。
  8.如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除, 剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量

三、HDFS的删除流程
  
  1.客服端发送RPC请求NaemNode。
  2.NameNode收到请求之后,将这个操作更新到edits文件,以及内存。
  3.NameNode更新完给客服返回一个ack信号,表示删除成功
  4.当NameNode执行delete方法时,它只标记操作涉及的需要被删除的数据块,而不会主动联系这些数据块所在的DataNode节点。
  5.当保存着这些数据块的DataNode节点向NameNode节点发送心跳时,NameNode校验到DataNode的数据不一致,NameNode节点会向DataNode发出指令,从而把数据删除掉。
  6.所以在执行完delete方法后的一段时间内,数据块才能被真正的删除掉。

注意:
  在读写过程中,NameNode只负责地址的记录和查询,所有的数据的读写都是客户端和DataNode直接联系,这种形式的好处在于能够提高NameNode的应答速度,同时提供HDFS的线程并发的能力
  安全模式 在重新启动HDFS后,会立即进入安全模式,此时不能操作hdfs中的文件,只能查看目录文件名等,读写操作都不能进行。
  namenode启动时,需要载入fsimage文件到内存,同时执行edits文件中各项操作。
  一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个步骤不需要SNN的参与)和一个空的编辑文件。
  此时namenode文件系统对于客户端来说是只读的。
  再此阶段NameNode收集各个DataNode的报告,当数据块达到 小复本数以上时,会被认为是“安全”的,在一定比例的数据块被确定为安全后,再经过若干时间,安全模式结束。
  当检测到副本数不足的数据块时,该块会被复制直到到达 小副本数,系统中数据块的位置并不是namenode维护的,而是以块列表的形式存储在datanode中。

你可能感兴趣的:(学习,hadoop)