Hadoop框架:NameNode工作机制详解

Hadoop框架:NameNode工作机制详解

本文源码:GitHub·点这里 || GitEE·点这里

一、存储机制

1、基础描述

NameNode运行时元数据需要存放在内存中,同时在磁盘中备份元数据的fsImage,当元数据有更新或者添加元数据时,修改内存中的元数据会把操作记录追加到edits日志文件中,这里不包括查询操作。如果NameNode节点发生故障,可以通过FsImage和Edits的合并,重新把元数据加载到内存中,此时SecondaryNameNode专门用于fsImage和edits的合并。

2、工作流程

<span>Hadoop框架:NameNode工作机制详解</span>

NameNode机制

  • NameNode格式化启动之后,首次会创建Fsimage和Edits文件;
  • 非首次启动直接加载FsImage镜像文件和Edits日志到内存中;
  • 客户端对元数据执行增删改操作会记录到Edits文件;
  • 然后请求的相关操作会修改内存中的元数据;

SecondaryNameNode机制

  • 询问NameNode是否需要CheckPoint,NameNode返回信息;
  • 如果需要SecondaryNameNode请求执行CheckPoint;
  • NameNode切割现有日志文件,新记录滚动写入新Edits文件;
  • 滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode;
  • SecondaryNameNode加载Edits日志和FsImage镜像文件到内存合并;
  • 生成新的镜像文件fsimage.chkpoint后拷贝到NameNode;
  • NameNode将fsimage.chkpoint重新命名成fsimage;

3、CheckPoint设置

通过修改hdfs-default.xml文件的相关配置,设置一些SecondaryNameNode的机制,例如每隔一小时执行一次。

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property>
<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value>
<description>文件满1000000记录数</description>
</property>
<property>
  <name>dfs.namenode.checkpoint.check.period</name>
  <value>60</value>
<description> 1分钟检查一次文件记录数</description>
</property >

二、文件信息

1、FsImage文件

NameNode内存中元数据序列化备份信息;

生成路径:基于NameNode节点

cd /opt/hadoop2.7/data/tmp/dfs/name/current/

<span>Hadoop框架:NameNode工作机制详解</span>

查看文件

# 基本语法
hdfs oiv -p 转换文件类型 -i 镜像文件 -o 转换后文件输出路径

基于语法格式,操作上图中的文件:

# 转换文件
hdfs oiv -p XML -i fsimage_0000000000000000019 -o /data/fsimage.xml
# 查看
cat /data/fsimage.xml

这样就可以看到一些元数据的信息。

2、Edits文件

存放HDFS文件的所有增删改操作的路径,会记录在Edits文件中。

基本语法

hdfs oev -p 转换文件类型 -i 日志文件 -o 转换后文件输出路径

查看文件

# 转换文件
hdfs oev -p XML -i edits_0000000000000000020-0000000000000000020 -o /data/edits.xml
# 查看
cat /data/edits.xml

三、故障恢复

1、拷贝SecondaryNameNode数据

首先结束NameNode进程;

删除NameNode存储的数据;

[root@hop01 /] rm -rf /opt/hadoop2.7/data/tmp/dfs/name/*

拷贝SecondaryNameNode中数据到NameNode数据存储目录下;

# 注意SecondaryNameNode服务配置在hop03上
[root@hop01 /] scp -r root@hop03:/opt/hadoop2.7/data/tmp/dfs/namesecondary/* /opt/hadoop2.7/data/tmp/dfs/name/

重新启动NameNode进程;

2、基于Checkpoint机制

修改hdfs-site.xml配置,同步到集群相关服务下,重启HDFS进程;

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>120</value>
</property>
<property>
  <name>dfs.namenode.name.dir</name>
  <value>/opt/hadoop2.7/data/tmp/dfs/name</value>
</property>

结束NameNode进程;

删除NameNode存储的数据;

[root@hop01 /] rm -rf /opt/hadoop2.7/data/tmp/dfs/name/*

由于集群中SecondaryNameNode(在hop03)不和NameNode(在hop01)在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件;

[root@hop01 /]scp -r root@hop03:/opt/hadoop2.7/data/tmp/dfs/namesecondary /opt/hadoop2.7/data/tmp/dfs/
[root@hop01 namesecondary/] rm -rf in_use.lock
[root@hop01 dfs]$ ls
data  name  namesecondary

导入检查点数据

[root@hop01 hadoop2.7] bin/hdfs namenode -importCheckpoint

重新启动NameNode

[root@hop01 hadoop2.7] sbin/hadoop-daemon.sh start namenode

四、多个目录配置

NameNode可以配置多本地目录,每个目录存放内容相同,增加运行的可靠性;

1、添加配置

# vim /opt/hadoop2.7/etc/hadoop/hdfs-site.xml
# 添加内容如下
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///${hadoop.tmp.dir}/dfs/name01,file:///${hadoop.tmp.dir}/dfs/name02</value>
</property>

该配置需要同步集群下所有服务;

2、删除原有数据

集群下所有服务都需要执行该操作;

[root@hop01 hadoop2.7]# rm -rf data/ logs/

格式化NameNode之后重启集群服务。

五、安全模式

1、基本描述

NameNode刚启动时,会基于镜像文件和编辑日志在内存中加载文件系统元数据的映像,然后开始监听DataNode请求,该过程期间处于一个只读的安全模式下,客户端无法上传文件,在该安全模式下DataNode会发送最新的数据块列表信息到NameNode,如果满足最小副本条件,NameNode在指定时间后就会退出安全模式。

2、安全模式

  • 安全模式状态
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode get
  • 进入安全模式
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode enter
  • 退出安全模式
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode leave
  • 等待安全模式
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode wait

六、源代码地址

GitHub·地址
https://github.com/cicadasmile/big-data-parent
GitEE·地址
https://gitee.com/cicadasmile/big-data-parent

推荐阅读:编程体系整理

序号 项目名称 GitHub地址 GitEE地址 推荐指数
01 Java描述设计模式,算法,数据结构 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
02 Java基础、并发、面向对象、Web开发 GitHub·点这里 GitEE·点这里 ☆☆☆☆
03 SpringCloud微服务基础组件案例详解 GitHub·点这里 GitEE·点这里 ☆☆☆
04 SpringCloud微服务架构实战综合案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
05 SpringBoot框架基础应用入门到进阶 GitHub·点这里 GitEE·点这里 ☆☆☆☆
06 SpringBoot框架整合开发常用中间件 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
07 数据管理、分布式、架构设计基础案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
08 大数据系列、存储、组件、计算等框架 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2705.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • StringUtils工具类常用方法「建议收藏」

    StringUtils工具类常用方法「建议收藏」StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字符串时使用StringUtils相比使用原生的String会更加安全。一、判空StringUtils提供常用的判断空字符串有两个方法:isEmpty和isBlank,这两者的有何区别呢,直接看源码://isEmptypublicstaticbooleanisEmpty(Stringstr)…

    2022年6月11日
    35
  • pycharm逐行调试时跳过了某行的解决办法[通俗易懂]

    pycharm逐行调试时跳过了某行的解决办法[通俗易懂]1.首先说原因我遇到的:是由于该行的函数,有装饰器(或者说闭包)装饰它。2.场景再现如图,在逐行调试的时候,我迫切想要知道第98行调试时所返回的内容,而且我还想进入98行的函数内,看看内部到底发生了什么。然而,当我点击StepOver调试下一行的时候,该死的蓝色调试框,跳到了第99行。3.如何解决此时我已经结束了本次debug,当我自己点进第98行的函数进去看的时候,发现没错,函数套了个@response_parser的装饰器,只要有这个装饰器存在,而且我debug时,跳过了该行。

    2022年8月28日
    2
  • 关于锚点

    关于锚点设置一个锚点文字关于锚点的一些示例 1 nbsp 链接一个空锚点 默认链接到网页顶部 2 nbsp 链接到本网页里 name meizz 的锚点 3 nbsp 链接到 test asp 里 meizz 的锚点

    2025年7月10日
    2
  • Java内存管理-程序运行过程(一)「建议收藏」

    勿在流沙住高台,出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine(Java虚拟机)!本系列会开启对JVM相关的知识的探索和总结,让我们一起踏入JVM的学习之旅中,去了解和发现更加精彩的Java世界! 正如奥古斯特·罗丹 说过:世界上不是缺少美,而是缺少发现美的眼…

    2022年2月28日
    51
  • 怎么创建CSV文件和怎么打开CSV文件[通俗易懂]

    怎么创建CSV文件和怎么打开CSV文件[通俗易懂]CSV(CommaSeparatedValues逗号分隔值)。.csv是一种文件格式(如.txt、.doc等),也可理解.csv文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间已英文字符的逗号或制表符(Tab)分隔。在windows系统环境上.csv文件打开方式有多种,如记事本、excel、Notepad++等,只要是文本编辑器都能正确打开。1.工具/原料E…

    2022年7月20日
    15
  • 解决打不开SQL Server配置管理器的问题[通俗易懂]

    解决打不开SQL Server配置管理器的问题[通俗易懂]最近被SqlServer搞得贼烦,下了俩次SQLSERVER,重装了一次系统,先对这次遇到的问题发一下感慨:深深地意识到权限的重要性了,一般计算机里面的软件都有不同的访问权限,普通用户(Users)、管理员(Administrators)、SYSTEM等等,以不同的身份去对这个软件进行操作时,就会有不同的访问权限,一般Administrator的权限是最大的 1)安…

    2022年7月20日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号