HDFS的写流程

1. HDFS的写流程
  A. 简单流程描述

HDFS的写流程
    a. 客户端发起Create File,目的是获取HDFS文件的输出流。
    b. namenode收到请求后。namenode收到请求后会检测权限,以及路径的合法性。
    c. 如果检测都通过,namenode会为这个文件生成块的元数据信息,比如①为文件切块②分配块id③分配每个块在哪个datanode上
    d. 将元数据信息封装到输出流中,返回给客户端
    e. Client拿到输出流之后,采用PipeLine(数据流管道)机制做数据的上传,这样设计的目的在于利用每台服务的带宽,最小化推送数据的延时。
     packet是一个64kb大小的数据包。即客户端在发送文件块时,会把文件块变成一个一个的数据包发送。
    f. 每台datanode收到packet后,会向上游做ack确认,如果接受失败,会进行重发
    g. 当一个文件上传完后,关流

  B. 详细流程描述

HDFS的写流程
    a. 由HDFS client创建一个分布式的文件系统类型的客户端Distributed FileSystem
    b. 向NameNode请求上传文件
    c. NameNode检查目录树是否可以创建文件①检查权限②检查目录结构(目录是否存在)
    d. NameNode向客户端响应可以上传文件
    e. 客户端向NameNode请求上传第一个Block(0~128M),请返回DataNode
    f. NameNode进行副本存储节点选择,包括本地节点,其他机架一个节点,其他机架的另一个节点
    g. NameNode向客户端返回DataNode节点列表,表示这些节点可以存储数据
    h. 客户端创建一个数据流FSDataOutputStream往DataNode上去写数据
    i. 客户端向首选的DataNode请求建立Block传输通道,DataNode向其他一台节点建立通道,直到满足副本个数
    j. 客户端向上游的DataNode发送数据包Package,上游DataNode向下游的DataNode发送数据包
       Package是一个64Kb的数据包,最小单位是chunk512byte加上chunksum4byte校验位
    k. 数据包首先传输到每台DataNode的ByteBuffer,一份写入本地磁盘,另一份传输给下一个DataNode的Bytebuffer
    l. 客户端和每一个DataNode节点都会有一个ack队列,当下游接受成功后会向上游返回ack确认,并从队列中移除
       接受失败时上游会向下游重发数据


  2. DataNode节点选择
    当NameNode需要给客户端返回DataNode节点时,
    首先根据节点距离最近原则,或本地化原则,例如在DataNode1上传时,优先选择DataNode1
    其次需要考虑负载均衡问题,会考虑是否有多个客户端同时往一个DataNode上去写

上一篇:pl/sql Dynamic Performance Tables not accessible,Automatic Statistics disabled for this session


下一篇:大数据运维4:如何提高节点下线速度或避免因节点掉线产生网络风暴?