zoukankan      html  css  js  c++  java
  • HDFS架构

    1.HDFS的Block块概念

    HDFS默认的Block块大小为128 MB。为何HDFS中的一个块那么大?

    HDFS的block块比磁盘的块大,目的是为了减小寻址开销。通过让一个块足够大,从磁盘转移数据的时间能够远远大于定位这个块开始端的时间。因此,传送一个由多个块组成的文件的时间就取决于磁盘传输送率

    //HDFS中 fsck 指令会显示块的信息
    % hadoop fsck / -files -blocks

    2.NN主要功能

     1). NN提供名称查询服务,它是一个Jetty服务器

     2).NN维护着两张关键性的表:①. filename -> blocksequence (namespace) ②. block -> machinelist ("inodes"). 第①张表保存在磁盘,非常珍贵。第②张表每次NN启动时都会在内存中重建。

     3).表①维护着整个HDFS系统的元数据信息。NN不需要从磁盘读取metadata,所有数据都在内存中,硬盘上的元数据文件 fsimage 和edits 只是序列化的结果,只有每次NN启动的时候才会读取。

     4). 表②记录着每个文件的数据块存储的DN,但它并不永久保存块的位置信息,因为这些信息由DN通过每6小时发送一次Block-Report时重建

    3.NN目录结构

    NN被格式化之后(区别于DN:使用前不用格式化),将产生如下所示的目录结构: 

     1). 实际生产环境中为了安全机制,将dfs.name.dir配置成以逗号隔开的一组目录,各个目录存储的内容相同。这个机制使得系统具备一定的还原能力,特别是当其中一个目录位于NFS之上时(推荐配置)

     2). fsimage文件其实是Hadoop文件系统元数据的一个永久性的检查点,其中包含Hadoop文件系统中的所有目录和文件idnode的序列化信息

     3). edits文件存放的是Hadoop文件系统的所有更新操作的路径,文件系统客户端执行的所以写操作首先会被记录到edits文件中

    4.SNN主要功能

    每个集群都有一个,SNN只有一个职责:合并NN中的edits到fsimage中,减少NN启动时间

    1. SNN请求NN停止使用edits文件,暂时将新的写操作记录到一个新的edits.new文件中。
    2. SNN通过网络从NN拷贝fsimage和edits文件。
    3. SNN首先将fsimage加载到内存,然后逐一执行edits中的操作,最后将内存中最新的元数据信息写到本地磁盘,生成新的fsimage文件(该fsimage就是SNN Checkpoint 生成的元数据文件)。
    4. SNN通过网络将新的fsimage拷贝到NN。
    5. NN用新的fsimage代替旧的fsimage;并用步骤 ① 所产生的edits(不一定为空)代替旧的edits文件。
    6. NN拥有最新的fsimage文件和一个更小的edits文件。SNN上也保存着最新的fsimage文件。

    除此之外,当NN处于安全模式时,管理员也可以调用以下命令来手动执行合并两文件

    //必须是在安全模式
    hdfs dfsadmin -safemode enter

    hadoop dfsadmin –saveNamespace

    从配置文件hdfs-default.xml中,可以看出SNN定期 3600s=1h 触发一次CheckPoint。不仅可以保证各个CheckPoint阶段的元数据的可靠性,同时,进行fsimage与edits的合并,可以有效限制edits的大小,防止其无限制增长。

    5.DN节点( 向NN 发送heartbeatDirectoryScan)

    1. DN响应来自HDFS客户端的读写请求,还响应来自NN的创建、删除和复制块的命令。
    2. DN启动后,首先向NN注册,然后周期性(21600s = 6小时)的向NN发送目录扫描信息(DirectoryScan)。
    3. 向NN定期(3秒一次)发送心跳(heartbeat)保持与其联系,如果NN10分钟没有收到DN的心跳,则认为其已经lost,并将其上的Blcok复制到其他DN节点。 

    6.DN目录结构

    DN存储目录启动时自动创建,不需要额外格式化【区别于DN】。通过参数dfs.datanode.data.dir 配置。 

    • 以blk_ 开始的块文件:节点所存储的数据本身
    • 以.meta结尾的元数据文件:包含数据块的长度、Blcok块数据的校验和以及时间戳
    • 都是以二进制形式保存的,可以使用读取二进制的命令od 验证

    Block副本放置策略:

    1. 副本1:上传Client的节点上
    2. 副本2:不同机架中的节点上
    3. 副本3:与第二个副本同一机架的另一个节点上

    7.文件的读取

                         

    1)    使用HDFS提供的客户端Client向远程的NN发起RPC请求

    2)    NN会视情况返回请求文件的部分或者全部Blcok列表,对于每个Blcok,NN都会返回所有存储该Blcok副本的DN地址

    3)    客户端Client会选择距离最近的DN来读取Blcok;如果客户端本身就是DN,将直接从本地读取数据

    4)    读取完当前Blcok的数据后,关闭与当前DN的连接,并寻找读取下一个Blcok块的最佳DN

    5)    当读完列表中的Blcok后,如若文件读取还没有结束,客户端会继续向NN获取下一批Blcok块的列表

    6)    每读取完一个Blcok都会进行CheckSum验证,如果CheckSum验证出现错误,客户端会通知NN,然后再从列表中选择下一个拥有该Blcok副本的DN继续读取

    8.文件的写入

     

    1)     NameNode发起文件写入的请求

    2)    NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息

    3)    Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中

  • 相关阅读:
    小程序对象属性赋值
    'cross-env' 不是内部或外部命令,也不是可运行的程序
    npm太慢, 淘宝npm镜像使用方法
    git设置忽略文件.gitignore
    小程序报错 Please do not register multiple Pages in undefined.js
    小程序监听滚动条
    获取动态元素高度
    小程序BUTTON点击,去掉背景色
    封装token
    JS删除对象属性
  • 原文地址:https://www.cnblogs.com/skyl/p/4744623.html
Copyright © 2011-2022 走看看