• HDFS读写流程


    一、HDFS中的block、packet、chunk

    1.Block

     在将文件上传到hdfs之间需要分块,这个块就是block,默认为128MB(hadoop2.X),当然可以更改。通过修改core-default.xml文件修改这个值,它是最大的一个单位。

    2.Packet

      Packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传输数据的基本单位,默认是64kb。

    3.Chunk

     Chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认为512B,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk的大小为516B。由此可见真实数据与校验值的比值约为128:1

    二、HDFS中的写流程

    1. 客户端通过RPC(远程服务)访问NameNode,请求写入一个文件。
    2. NameNode检查客户端是否有权限写入,如果有权限返回一个响应。如果没有客户端就会抛出一个异常。
    3. 客户端会将文件按BlckSize大小(默认128M)将文件切分成若干个Block块,然后请求写入第一个Block块。
    4. NameNode会根据它的负载均衡机制,给客户端返回满足其副本数量(默认是3)的列表(BlockId:主机,端口号,存放的目录)。
    5. 客户端根据返回的列表,开始建立管道(pipline)。(管道连接方向:客户端->第一个节点->第二个节点->第三个节点)
    6. 开始传输数据,Block按照Packet传输,当一个Packet成功传输到第一个DataNode上以后,第一个DodaNode就把这个Packet进行复制,并将这个Packet通过管道传输到下一个DataNode上,下一个DataNode接收到Packet后,继续进行复制,再传输到下一个DataNode上。
    7. 当一个Block块成功传输完以后,从最后一个DataNode开始,依次从管道返回ACK队列,到客户端。
    8. 客户端会在自己内部维护着一个ACK队列,跟返回来的ACK队列进行匹配,只要有一台DataNode写成功,就认为这次写操作是完成的。
    9. 开始进行下一个Block块的写入。重复步骤3-8。

     注意:

            如果在传输的时候,DataNode宕机了,这个DataNode就会从这个管道中退出。剩下的DataNode继续传输。然后,等传输完成以后,NameNode会再分发出一个节点,去写成功的DataNode上复制出一份Block块,写到新的DataNode上。

     三、HDFS中的读流程

     

    1. 客户端通过RPC向NameNode发送读请求。
    2. NameNode确认客户端是否有读权限,如果有,给客户端返回一个响应,如果没有,客户端抛出一个异常。
    3. 客户端向NameNode请求需要读取的文件。
    4. NameNode返回存储此文件的每个Block块所在的位置的列表。
    5. 客户端会从返回的列表中挑选一台最近的,建立连接,读取Block块。读取的时候会将Block块统计目录下的校验信息,一起读取过来。
    6. 客户端读取完Block块信息以后,会计算出一个校验和跟读取过来的校验和进行对比,如果能匹配上,就说明正确。如果匹配不上,就从其他节点上读取Block块。
    努力到无能为力,拼搏到感动自己
  • 相关阅读:
    CADisplayLink
    对项目重命名
    TCP|UDP|Http|Socket
    CoreAnimation|动画
    Autolayout
    通讯录
    本地通知
    用于做 Android 屏幕自适应的文章资源
    Java String.format 自动补全不够的位数
    不同语言之间 日期格式转换
  • 原文地址:https://www.cnblogs.com/tkzm/p/11400639.html
Copyright © 2020-2023  润新知