zoukankan      html  css  js  c++  java
  • 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。
  • 相关阅读:
    wim文件位置
    用DISM++来管理wim当中的驱动
    交易所基金代码段
    systemd配置nginx
    MACD公式
    nginx配置
    linux的tmfps
    nohup&
    geth
    RGB
  • 原文地址:https://www.cnblogs.com/jason-lc/p/9564239.html
Copyright © 2011-2022 走看看