大数据学习之hadoop——08NameNode、DataNode工作机制、原理

NameNode原理

1、磁盘与内存

在NameNode开始服务时,将会读取磁盘上的edits,fsimage文件,在内存(缓存)使用这些数据
读到内存中使用的原因:和磁盘多次交互会导致效率变低,从内存增删改查则是高效的选择(例:对文件进行2000000次相同内容的删除增加,在内存中执行此操作,到最后到磁盘上的结果就是什么都没发生)

2、NameNode运行原理

  • edits:编辑日志(操作过程数据)
  • fsimages:镜像文件(某一时刻的完整状态,HDFS只会保存最新的两个镜像文件)

2.1、在hdfs第一次启动时,会在name目录下创建edits和fsimage文件。在之后的启动过程中,HDFS会把磁盘中最新的fsimage文件和edits文件加载到内存中,并且同时创建edits.inprogress文件。
2.2、edits文件分为两种,正在运行的文件系统将操作存储至edits_improgressxxx文件,在集群关闭或者进行滚动日志时该文件将转化为edits_xxx文件,如果是日志滚动将会生成新的edits_improgressxxx文件
2.3、例2:有一家公司的财务需要每两个月清算一下账单,清算结束后将结果布告。在这两个月中公司的所有进出账都会进行记录,并且浮动资金超过30%就要清算一次变成小账本,所以这两个月中可能只有一个小账本也可能有多个小账本。到了两个月就将所有小账本其合并至总账单中。如果工商局在一个半月的时候突然要求查看所有账单,那么进行合并将会是上次结算的总账单,所有已经总结好的小账本,以及还没来得及整理成小账本的财务明细
在本例中:

  • 财务的总账单—>fsimage文件
  • 小账本—>edits日志文件
  • 没来的及整理成小账本的财务明细—>edits.inprogress文件
  • 每两个月总结一次—>HDFS运行时间为一小时
  • 浮动资金超过30%—>HDFS的操作记录数达到100万条
    在这里插入图片描述

3、NameNode工作原理、checkpoint合并机制

那么合并的工作由谁来做,什么时间做?

  • SecondryNameNode将会执行这个操作
    • 每隔一分钟SNN将会询问NN是否需要合并
  • 触发两个条件之一将会合并
    • 记录数达到100万条
    • 集群运行时间达到了一小时
      每次合并fsimage文件与edits文件都相当于合并 存储的最后一个fsimage文件和最后一段edits文件,以及当前集群的edits.inprogress滚动而来的文件
  • 一次完整的checkpoint
    • 1、 NameNode将最新的fsimage001文件和edits001文件读取到内存中,以此来保证文件系统是最新的状态
    • 2、客户端发起对文件系统上的内容进行修改
    • 3、最新的edits001文件进行一次滚动生成下一个edits02文件,并且生成edits.inprogress001文件,用来存储本次集群开启将进行的所有操作
    • 4、用户提出的请求将会在内存中进行修改,并将操作记录记录至edits.inprogress001文件中
    • 5、SNN向NN询问是否需要checkpoint(当文件系统运行了1小时或者操作记录达到100万次)
    • 6、请求执行checkpoint操作
    • 7、滚动正在记录的edits.inprogress001文件为edits003文件,并生成新的edits.inprogress002文件,记录在合并过程中对文件系统的操作
    • 8、将edits002、edits003、fsimage001拷贝至SNN加载至内存进行合并
    • 9、生成新的fsimage.chkpoint001文件
    • 10、将新生成的fsimage.chkpoint001文件拷贝至NameNode中
    • 11、将拷贝过来的fsimage.chkpoint001重命名为fsimage002文件,
    • 12、下一次合并的应为由edits.inprogress002转化而来的edits文件、fsimage002文件、以及新生成的edits.inprogress滚动而来的文件,共同合并。
      在这里插入图片描述

DataNode原理

1、两种文件

一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件

  • 数据本身
  • 元数据:包括数据块的长度,块数据的校验和,以及时间戳。

2、DataNode工作机制

  • 2.1、DataNode启动后向NameNode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。
  • 2.2、NameNode每隔三秒向DataNode发送一次请求,达到确认该DataNode节点仍在服务,将指令发给DataNode节点
  • 2.3、十分钟之内,DataNode向NameNode发送回执请求,确认DataNode仍在服务
  • 2.4、如果超过十分钟DataNode仍没有发送回执请求,NameNode则认为该节点已经不可用。

3、动态服役、退役DataNode节点

在实际生产环境下,集群可能关闭或者启动将耗费很长时间,所以是不能够随意关闭启动的。在此状态下我们也能向集群中添加、删除DataNode节点

  • 3.1、服役新节点
    • 准备一台虚拟机
    • 修改IP地址,主机名称
    • 删除hadoop相关所有文件
    • 在namenode的hadoop-2.7.6/etc/hadoop目录下创建dfs.hosts文件(文件内容为所有正在服役的Datanode节点名称以及将要服役的节点名称,用主机名,每行一个不允许空格)
    • 在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性
      在这里插入图片描述
    • 刷新NameNodehdfs dfsadmin -refreshNodes
    • 更新resourcemanager节点yarn rmadmin -refreshNodes
    • 在namenode节点的slaves文件中增加新服役的主机名
    • 将hadoop/etc/hadoop的整个文件夹分发至集群中
    • 在新服役的机器上启动DataNode服务
      • [bduser@node105 hadoop-2.7.6]$ sbin/hadoop-daemon.sh start datanode
      • [bduser@node105 hadoop-2.7.6]$ sbin/yarn-daemon.sh start nodemanager
    • 在webUI上查看是否有新节点服务信息
  • 3.2、退役旧节点
    • 在/hadoop-2.7.6/etc/hadoop目录下创建dfs.hosts.exclude文件,文件内容为即将退役的节点主机名
    • 在NameNode上把刚才在hdfs-site.xml中增加的属性注释,添加新的属性
      在这里插入图片描述
    • 将/hadoop2.7.3/etc/hadoop同步到所有节点上
    • 同样刷新namenode和resourcemanager
    • 等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
    • 在退役节点上运行
      • [bduser@node105 hadoop-2.7.6]$ sbin/hadoop-daemon.sh stop datanode
      • [bduser@node105 hadoop-2.7.6]$ sbin/yarn-daemon.sh stop nodemanager
    • 从namenode的slave文件中删除退役节点

猜你喜欢

转载自blog.csdn.net/nothair/article/details/104956763