HDFS-NameNode和DataNode工作机制

本文深入剖析了HDFS中NameNode和DataNode的工作机制,包括NameNode的启动过程、Secondary NameNode的角色、元数据管理,以及DataNode的数据存储、心跳机制和数据完整性检查。此外,还介绍了如何处理NameNode故障,以及Hadoop存档和回收站功能的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、NameNode工作机制

1.1、NameNode&Secondary NameNode 工作机制

1)第一阶段:namenode 启动

(1)第一次启动namenode格式化后,创建fsimage(记录文件的最终状态)和edits(记录操作日志)文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)namenode 记录操作日志,更新滚动日志。

(4)namenode 在内存中对数据进行增删改查。

2)第二阶段:Secondary NameNode 工作 (合并edits和fsimage文件)

(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。

1.2、镜像文件和编辑日志文件

namenode 被格式化之后,将在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current 目录中 产生如下文件:

(1)Fsimage 文件:HDFS 文件系统元数据的一个永久性的检查点,其中包含 HDFS 文件系统的所有目录和文件 idnode 的序列化信息。

(2)Edits 文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。

(3)seen_txid 文件保存的是一个数字,就是最后一个 edits_的数字

(4)每次 Namenode 启动的时候都会将 fsimage 文件读入内存,并从 00001 开始 到 seen_txid 中记录的数字依次执行每个 edits 里面的更新操作,保证内存中的元数据信息 是最新的、同步的,可以看成 Namenode 启动的时候就将 fsimage 和 edits 文件进行了合 并。

1.3、web 端访问 SecondaryNameNode 端口号

(1)启动集群。

(2)浏览器中输入:http://47.105.157.216:50090/status.html

(3)查看 SecondaryNameNode 信息。

1.4、chkpoint 检查时间参数设置

(1)通常情况下,SecondaryNameNode 每隔一小时执行一次。

[hdfs-default.xml]

(2)一分钟检查一次操作次数,当操作次数达到 1 百万时,SecondaryNameNode 执行 一次。

1.5、SecondaryNameNode 目录结构

Secondary NameNode 用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS元数据的快照。

在 /opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/current 这 个 目 录 中 查 看 SecondaryNameNode 目录结构。

SecondaryNameNode 的 namesecondary/current 目录和主 namenode 的 current 目录的布局 相同。

好 处 : 在 主 namenode 发 生 故 障 时 ( 假 设 没 有 及 时 备 份 数 据 ) , 可 以 从 SecondaryNameNode 恢复数据。

1.6、Namenode 故障处理方法 

将 SecondaryNameNode 中数据拷贝到 namenode 存储数据的目录;

1)kill -9 namenode进程

2)删除 namenode 存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

3)拷贝 SecondaryNameNode 中数据到原 namenode 存储数据目录

scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/

4)重新启动 namenode

sbin/hadoop-daemon.sh start namenode

 

2、DataNode工作机制

2.1、DataNode 工作机制

1)一个数据块在 datanode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本 身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

2)DataNode 启动后向 namenode 注册,通过后,周期性(1 小时)的向 namenode 上报 所有的块信息。

3)心跳是每 3 秒一次,心跳返回结果带有 namenode 给该 datanode 的命令如复制块数据 到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 datanode 的心跳,则认 为该节点不可用。

4)集群运行中可以安全加入和退出一些机器

2.2、数据完整性

1)当 DataNode 读取 block 的时候,它会计算 checksum

2)如果计算后的 checksum,与 block 创建时值不一样,说明 block 已经损坏。

3)client 读取其他 DataNode 上的 block。

4)datanode 在其文件创建后周期验证 checksum

2.3、DataNode 的目录结构

和 namenode 不同的是,datanode 的存储目录是初始阶段自动创建的,不需要额外格式 化。

1)在/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current 这个目录下查看版本号

cat VERSION

storageID=DS-1b998a1d-71a3-43d5-82dc-c0ff3294921b

clusterID=CID-1f2bf8d1-5ad2-4202-af1c-6713ab381175

cTime=0

datanodeUuid=970b2daf-63b8-4e17-a514-d81741392165

storageType=DATA_NODE

layoutVersion=-56

2.4、服役新数据节点(了解)

随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据 的需求,需要在原有集群基础上动态添加新的数据节点。

具体步骤省略......

2.5、退役旧数据节点(了解)

具体步骤省略......

 

3、补充其他功能

3.1、Hadoop 存档

1)理论概述

每个文件均按块存储,每个块的元数据存储在 namenode 的内存中,因此 hadoop 存储 小文件会非常低效。因为大量的小文件会耗尽 namenode 中的大部分内存。但注意,存储小 文件所需要的磁盘容量和存储这些文件原始内容所需要的磁盘空间相比也不会增多。例如, 一个 1MB 的文件以大小为 128MB 的块存储,使用的是 1MB 的磁盘空间,而不是 128MB。

Hadoop 存档文件或 HAR 文件,是一个更高效的文件存档工具,它将文件存入 HDFS 块,在减少 namenode 内存使用的同时,允许对文件进行透明的访问。具体说来,Hadoop 存档文件可以用作 MapReduce 的输入。

2)案例实操

(1)需要启动 yarn 进程

start-yarn.sh

(2)归档文件

归档成一个叫做 xxx.har 的文件夹,该文件夹下有相应的数据文件。Xx.har 目录是 一个整体,该目录看成是一个归档文件即可。

bin/hadoop archive -archiveName myhar.har -p /user/atguigu /user/my

(3)查看归档

hadoop fs -lsr /user/my/myhar.har

hadoop fs -lsr har:///myhar.har

(4)解归档文件

hadoop fs -cp har:/// user/my/myhar.har /* /user/atguigu

3.2、回收站

1)默认回收站

默认值 fs.trash.interval=0,0 表示禁用回收站,可以设置删除文件的存活时间。

默认值 fs.trash.checkpoint.interval=0,检查回收站的间隔时间。

要求 fs.trash.checkpoint.interval<=fs.trash.interval。

2)启用回收站

修改 core-site.xml,配置垃圾回收时间为 1 分钟。

3)查看回收站

回收站在集群中的;路径:/user/atguigu/.Trash/….

4)修改访问垃圾回收站用户名称

进入垃圾回收站用户名称,默认是 dr.who,修改为 atguigu 用户

[core-site.xml]

5)通过程序删除的文件不会经过回收站,需要调用 moveToTrash()才进入回收站

Trash trash = New Trash(conf);

trash.moveToTrash(path);

6)恢复回收站数据

hadoop fs -mv /user/atguigu/.Trash/Current/user/atguigu/input /user/atguigu/input

7)清空回收站

hdfs dfs -expunge

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值