13 |NameNode和SecondaryNameNode

NN和2NN工作机制
思考:NameNode中的元数据是存储在哪里的?
首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。
这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。
但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。

1)第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对元数据进行增删改。
2)第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
5.2 Fsimage和Edits解析

1)oiv查看Fsimage文件
(1)查看oiv和oev命令
[atguigu@hadoop102 current]$ hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file
(2)基本语法
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
(3)案例实操
[atguigu@hadoop102 current]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/name/current

[atguigu@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml

[atguigu@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/fsimage.xml
将显示的xml文件内容拷贝到Idea中创建的xml文件中,并格式化。部分显示结果如下。

16386
DIRECTORY
user
1512722284477
atguigu:supergroup:rwxr-xr-x
-1
-1


16387
DIRECTORY
atguigu
1512790549080
atguigu:supergroup:rwxr-xr-x
-1
-1


16389
FILE
wc.input
3
1512722322219
1512722321610
134217728
atguigu:supergroup:rw-r–r–


1073741825
1001
59



思考:可以看出,Fsimage中没有记录块所对应DataNode,为什么?
在集群启动后,要求DataNode上报数据块信息,并间隔一段时间后再次上报。
2)oev查看Edits文件
(1)基本语法
hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
(2)案例实操
[atguigu@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml

[atguigu@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/edits.xml
将显示的xml文件内容拷贝到Idea中创建的xml文件中,并格式化。显示结果如下。

<?xml version="1.0" encoding="UTF-8"?> -63 OP_START_LOG_SEGMENT 129 OP_ADD 130 0 16407 /hello7.txt 2 1512943607866 1512943607866 134217728 DFSClient_NONMAPREDUCE_-1544295051_1 192.168.10.102 true atguigu supergroup 420 908eafd4-9aec-4288-96f1-e8011d181561 0 OP_ALLOCATE_BLOCK_ID 131 1073741839 OP_SET_GENSTAMP_V2 132 1016 OP_ADD_BLOCK 133 /hello7.txt 1073741839 0 1016 -2 OP_CLOSE 134 0 0 /hello7.txt 2 1512943608761 1512943607866 134217728 false 1073741839 25 1016 atguigu supergroup 420 思考:NameNode如何确定下次开机启动的时候合并哪些Edits? 5.3 CheckPoint时间设置 1)通常情况下,SecondaryNameNode每隔一小时执行一次。 [hdfs-default.xml] dfs.namenode.checkpoint.period 3600s 2)一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次。 dfs.namenode.checkpoint.txns 1000000 操作动作次数 dfs.namenode.checkpoint.check.period 60s 1分钟检查一次操作次数
Hadoop批量启动时无法启动NameNodeSecondaryNameNode,可尝试以下解决办法: ### 检查配置文件 - **配置文件路径**:确保`core-site.xml`、`hdfs-site.xml`等配置文件路径正确,且配置无误。例如,`dfs.namenode.name.dir`等关键配置项的值路径存在且有读写权限。 ```xml <property> <name>dfs.namenode.name.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value> </property> ``` - **配置一致性**:检查集群中各节点的配置文件是否一致,不一致可能导致启动失败。 ### 检查端口占用 NameNodeSecondaryNameNode启动时会使用特定端口,若端口被占用则无法启动。可使用以下命令检查端口占用情况: ```bash netstat -tlnp | grep <端口号> ``` 若发现端口被占用,可通过`kill -9 <进程ID>`命令终止占用端口的进程,或者修改配置文件中的端口号。 ### 检查数据目录 - **数据目录权限**:确保NameNodeSecondaryNameNode的数据存储目录有足够的读写权限。例如,使用以下命令修改目录权限: ```bash chmod -R 755 /opt/module/hadoop-2.7.2/data/tmp/dfs/name ``` - **数据目录内容**:若数据目录内容损坏或不完整,可能导致启动失败。可尝试删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name),再重新格式化NameNode: ```bash rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/* bin/hdfs namenode -format ``` ### 检查日志文件 查看Hadoop日志文件,通常位于`$HADOOP_HOME/logs`目录下,从中获取详细的错误信息,根据错误信息进行针对性解决。 ### 检查Java环境 NameNodeSecondaryNameNode依赖Java环境,确保Java环境变量配置正确,可使用以下命令检查Java版本: ```bash java -version ``` ### 检查防火墙 防火墙可能会阻止NameNodeSecondaryNameNode之间的通信,可暂时关闭防火墙或开放相关端口: ```bash systemctl stop firewalld ``` ### 检查进程状态 使用`jps`命令检查NameNodeSecondaryNameNode进程是否已经存在,若存在可先使用`kill -9 <进程ID>`命令终止进程,再重新启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值