Java大数据之路--HDFS详解(2)--技术细节

HDFS(分布式文件存储系统)--技术细节

目录

HDFS(分布式文件存储系统)--技术细节

一、HDFS架构

二、Block

三、NameNode

四、副本放置策略

五、机架感知策略

六、DataNode

七、SecondaryNameNode


一、HDFS架构

  1. HDFS中,存储数据的时候会将数据进行切块,每一个块称之为Block
  2. 本身是一个分布式的,可扩展,可靠的文件系统
  3. HDFS中包含三个主要的进程:NameNode(用于管理节点和记录元数据),DataNode(用于存储数据),SecondaryNameNode。这三个进程一般是分布式不同的主机上,所以一般习惯上是用进程的名字称呼节点
  4. HDFS会对数据自动备份两次,称之为副本(replication)。如果不指定,默认情况下副本数量为3(额外复制两次,加上原来的构成3个副本)

 

二、Block

  1. 在HDFS中,数据都是以Block为单位进行存储的
  2. 默认情况下,Hadoop1.0中的Block的大小是64M,Hadoop2.0中的Block的大小是128M,通过dfs.blocksize来调节大小
  3. 如果一个文件不足一个Block大小,则这个文件整体作为一个Block存储,并且Block大小和文件大小是一致的
  4. 切块的优点:
    1. 文件块可以保存在不同的节点上,能够存储超大文件
    2. 有利于数据的复制,便于快速备份(把大文件拆分开来,分节点复制)
  5. 一个块(Block)的不同副本一定在不同节点上,不同Block的副本可能在一个节点上

三、NameNode

  1. NameNode是HDFS的核心节点,用于管理DataNode以及存储元数据
  2. NameNode维护HDFS中的元数据信息:
    1. 文件的存储路径
    2. 文件权限
    3. 文件大小和Block大小信息
    4. BlockID
    5. Block和DataNode(节点)之间的关系信息
    6. 副本数量
    7. 元数据格式参照:FileName replicas block-Ids id2host。例如: /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
  3. 每一条元数据大概是150B大小
  4. NameNode会将元数据存储在内存以及磁盘中:
    1. 存储在内存中的目的是为了快速查询
    2. 存储在磁盘中是为了崩溃恢复
  5. 元数据信息会持久化到NameNode节点的硬盘上,持久化目录的路径是由core-site.xml的dfs.tmp.dir属性来决定的。此参数如果不配置,默认是放在/tmp

  6. 存储元数据的目录:dfs/name/current

  7. 持久化文件包括:
    1. fsimage:元数据镜像文件。存储某NameNode元数据信息,并不是实时同步内存中的数据。一般而言,fsimage中的元数据是落后于内存中的元数据的
    2. edits:操作日志文件,记录了NameNode所要执行的操作
  8. NameNode在接收到写操作时,先把这条命令记录到edits中,再更改内存中的元数据,更改成功给Client返回成功信号,不会实时记录到fsimage中,而需要达到一定条件在进行更新,所以fsimage往往是落后于内存中的元数据的,这样设计的目的是为了保证操作的可靠-只要记录成功了,这个操作就一定会执行。
  9. 当内存中数据越来越多,fsimage一直没有更新会导致数据差异越来越大,当fsimage进行更新的时候,他是将edits文件中的操作一一取出,重新执行到fsimage中。此时edits_inprogress会滚动成edits文件,同时生成一个新的edits_inprogress用于记录新操作。
  10. fsimage更新和edits滚动触发条件:
    1. 空间:当edits文件达到指定大小(默认是64M,这个大小可以通过fs.checkpoint.size----core-site.xml来调节)的时候,会触发edits文件的滚动。
    2. 时间:当距离上次滚动间隔指定时间(默认是3600S,这个时间可以通过fs.checkpoint.period来调节-----core-site.xml)之后,会触发edits文件的滚动。
    3. 重启:当NameNode重启的时候,会触发滚动。
    4. 强制:通过hadoop dfsadmin -rollEdits命令来强制edits文件滚动。
  11. DataNode会通过RPC心跳机制来向NameNode注册管理---DataNode会定时(每隔3S)的发送心跳信息给NameNode。
  12. 心跳信息:
    1. 当前DataNode中的Block信息
    2. 当前DataNode的状态(预服役,服役,预退役,退役(节点不能发送退役状态,前面三种都能发送))
  13. NameNode如果在10min没有收到DataNode的心跳,则认为这个DataNode已经lost,会将这节点上的数据(在其他节点上的副本)备份放到其他节点上,保证整个集群中的副本数量
  14. NameNode重新启动之后,进行fsimage文件的更新/edits文件的滚动,将fsimage文件中的内容加载到内存中,等待DataNode的心跳,如果在指定的时间内没有等到心跳,则认为这个DataNode已经丢失需要对应处理,如果等到了心跳那么NameNode对DataNode的数据进行校验,校验DataNode中的数据和元数据记录是否一致,如果校验失败,则会试图去恢复这个数据。恢复之后会再次校验。如果校验成功则对外提供服务,不然只对外提供读服务。---------这个过程称之为安全模式(safe mode)
  15. 在安全模式中,HDFS集群只对外提供读服务。
  16. 也正因为有安全模式的校验问题,所以要求副本数量不能多于节点数量。
  17. 如果在合理的时间内,集群没有自动退出安全模式,那么可能就已经产生了数据丢失,并且这个数据不可恢复。
  18. 强制退出安全模式:hadoop dsfadmin -safemode leave
  19. 参考资料

四、副本放置策略

  1. 第一个副本:
    1. 如果是集群内部上传,谁上传第一个副本就在谁身上。
    2. 如果是集群外部上传,则第一个副本会放在相对空闲的节点上。
  2. 第二个副本:
    1. Hadoop2.7之前:第二个副本是放在和第一个副本不同机架(防止整个机架都宕机)的节点上
    2. Hadoop2.7开始:第二个副本是放在和第一个副本同一个机架(机架内部传输快)节点上
  3. 第三个副本:
    1. Hadoop2.7之前:第三个副本是放在和第二个副本同一个机架(机架内部传输快)节点上
    2. Hadoop2.7开始:第三个副本是放在和第二个副本不同机架(防止整个机架都宕机)的节点上
  4. 更多副本:
    1. 谁闲放在谁身上

五、机架感知策略

  1. 所谓的机架不是物理机架而是逻辑机架,本质上就是一个映射
  2. 可以将不同物理机架的节点映射到同一个逻辑机架上
  3. 实际过程中会将同一个物理机架的节点去映射到同一个逻辑机架上

六、DataNode

  1. 存储Block
  2. DataNode给NameNode发送心跳
  3. 存储Block的路径也是由hadoop.tmp.dir属性中修改

七、SecondaryNameNode

  1. SecondaryNameNode并不是NameNode的备份,这个节点作用是辅助NameNode完成edits文件的滚动
  2. 在完全分布式中,一旦出现SecondaryNameNode,则edits文件的滚动是在SecondaryNameNode上进行;如果没有SecondaryNameNode,则edits文件的滚动由NameNode自己完成
  3. 在HDFS集群中,只能采取NameNode+SecondaryNameNode结构或者是双NameNode结构,因为SecondaryNameNode的作用可以被NameNode取代,但是NameNode作为核心节点如果只有1个容易出现单点故障,所以实际过程中往往会舍弃SecondaryNameNode采用双NameNode结构来构成NameNode的HA(高可用)

猜你喜欢

转载自blog.csdn.net/a34651714/article/details/102812077