hadoop---hdfs详解(二)

HDFS写文件

  1. 使用HDFS提供的客户端Client,向远程的namenode发起RPC请求
  2. Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
    3.当客户端开始写入文件的时候,客户端会将文件切分成多个packets,并在内部以数据队列“data queue”的形式管理这些packets,并向namenode申请blocks,获取用来存储replicas(副本)的合适的DataNode列表,列表的大小根据namenode中replication的设定而定;
    4.开始以pipeline(管道)的形式将packet写入所有的replicas中。客户端把packet以流的方式写入一个DataNode,该DataNode把该packet存储之后,再将其传递给在此pipeline中的下一个DataNode,直到最后一个DataNode,这种写数据的方式呈流水线的形式。
    5.最后一个DataNode成功存储之后会返回一个ack packet(确认队列),在pipeline里传递至客户端,在客户端的开发库内部维护着“ack queue”,成功收到DataNode返回的ack packet后会从“data queue”移除相应的packet。
    6.如果传输过程中,有某个DataNode出现了故障,那么当前的pipeline会被关闭,出现故障的DataNode会从当前的pipeline中移除,剩余的block会继续剩下的DataNode中继续以pipeline的形式传输,同时namenode会分配一个新的DataNode,保持replicas设定的数量。
    7.客户端完成数据写入后,会对数据流调用close()方法,关闭数据流。
    8.只要写入了dfs.replication.min(最小写入成功的副本数)的副本数(默认为1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标副本数(dfs.replication的默认值为3),因为namenode已经直到文件由哪些块组成,所以它在返回成功前只需要等待数据块进行最小量的复制。
    HDFS 读操作


    1.客户端调用FileSystem实例的open方法,获取这个文件对应的输入流InputStream.
    2.通过RPC远程调用NameNode,获取NameNode中此文件对应的数据块保存位置,包括这个文件的副本的保存位置(主要是各DataNode的地址)。
    3.获取输入流之后,客户端调用read方法读取数据。选择最近的DataNode建立连接并读取数据。
    4.如果客户端和其中一个DataNode位于同一机器(比如MapReduce过程中的mapper和reduce),那么就会直接从本地读取数据。
    5.到达数据块末端,关闭与这个DataNode的连接,然后重新查找下一个数据块。
    6.不断执行第2-5步直到数据全部读完。
    7.客户端调用close,关闭输入流DFS InputStream。
posted @ 2018-08-31 10:15  jason*liu  阅读(215)  评论(0编辑  收藏  举报