Hadoop学习笔记(四)HDFS部分下

一、HDFS 的数据流

1.1 HDFS的写数据流程

在这里插入图片描述

  1. 客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件,NameNode 检查目标文件是否已存在,父目录是否存在。
  2. NameNode 返回是否可以上传。
  3. 客户端请求第一个 Block 上传到哪几个 DataNode 服务器上。
  4. NameNode 返回 DataNode 节点,假设分别为 dn1、dn2、dn3。
  5. 客户端通过 FSDataOutputStream 模块请求 dn1 上传数据,dn1 收到请求会继续调用dn2,然后 dn2 调用 dn3 ,将这个通信管道建立完成。
  6. dn1、dn2、dn3 逐级应答客户端。
  7. 客户端开始往 dn1 上传第一个 Block(先从磁盘读取数据放到一个本地内存缓存),以Packet 为单位,dn1 收到一个 Packet 就会传给 dn2,dn2 传给 dn3;dn1 每传一个 packet 会放入一个应答队列等待应答。
  8. 当一个Block传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务器。(重复执行3-7步)。

1.2 HDFS 的读数据流程

在这里插入图片描述

  1. 客户端通过 Distributed FileSystem 向 NameNode 请求下载文件,NameNode 通过查询元数据,找到文件块所在的 DataNode 地址。
  2. 挑选一台 DataNode(就近原则,然后随机)服务器,请求读取数据。
  3. DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位来做校验)。
  4. 客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。

1.3 副本存储节点选择

  • Hadoop3.x 的副本存储策略的侧重点为安全。若文件默认副本数为3,则即上传文件后,在上传的服务器(机架A)处保存一个副本后,优先选择另一个非机架A的机架内的随机一个节点存储第二个副本。第三个副本在第二个副本所在机架的随机节点进行存储。
  • Hadoop2.x 的副本存储策略的侧重点为效率。若文件默认副本数为3,则即上传文件后,在上传的服务器(机架A)处保存一个副本后,优先选择同一机架即机架A内的其他随机节点存储第二个副本。第三个副本选择其他机架内的随机节点存储。

二、NameNode和SecondaryNameNode

2.1 NameNode和SecondaryNameNode工作机制

​ NameNode中的元数据是存储在哪里的?

​ 首先,我们做个假设,如果存储在 NameNode 节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的 FsImage

​ 这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新 FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数据丢失。因此,引入 Edits 文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到 Edits 中。这样,一旦 NameNode 节点断电,可以通过 FsImage 和 Edits 的合并,合成元数据。

​ 但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这个操作由 NameNode 节点完成,又会效率过低。因此,引入一个新的节点 SecondaryNamenode,专门用于 FsImage 和 Edits 的合并。

NameNode工作机制:
在这里插入图片描述

  • 第一阶段:NameNode启动
  1. ​ 第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  2. ​ 客户端对元数据进行增删改的请求。
  3. ​ NameNode 记录操作日志,更新滚动日志。
  4. ​ NameNode 在内存中对元数据进行增删改。
  • 第二阶段: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。

2.2 Fsimage 和Edits 解析

NameNode 被格式化后,将在 ${HADOOP_HOME}/data/name/current 目录中产生如下文件

fsimage_0000000000000000000fsimage_0000000000000000000.md5seen_txidVERSION 四个文件。

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

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

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

每次 NameNode 启动的时候都会将 Fsimage 文件读入内存,加载Edits里面的更新操作,保证内存中的元数据都是最新的、同步的,可以看成 NameNode 启动的时候就将Fsimage 和 Edits 文件进行了合并。

oiv查看 Fsimage 文件:

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

hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml

Fsimage 中没有记录块所对应 DataNode 是因为在集群启动后,才会要求DataNode上报数据块信息,并间隔一段时间后再次上报。

oev查看Edits文件:

基本语法:hdfs oev -p [文件类型] -i [编辑日志] -o [转换后文件输出路径]

hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml

NameNode 启动的时候合并的是上次停机前正在写入的 Edits,即 edits_inprogress_xxx

根据 seen_txid 里面记录最新的 Fsimage(镜像文件) 的值去合并 Edits(编辑日志) 。

2.3 CheckPoint 时间设置

通常情况下,SecondaryNameNode 每隔一小时执行一次。可以通过修改 hdfs-default.xml 配置文件进行变更。

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property>

但如果小操作非常多,比如50分钟执行了200万次操作时突然宕机,那这些操作都会丢失,所以SecondaryNameNode 一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode 执行一次 CheckPoint。也可通过修改进行 hdfs-default.xml 配置。

<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value>
<description>操作动作次数</description>
</property>

<property>
  <name>dfs.namenode.checkpoint.check.period</name>
  <value>60</value>
<description> 1分钟检查一次操作次数</description>
</property >

三、DataNode

3.1 DataNode 工作机制

在这里插入图片描述

  1. 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
  2. DataNode 启动后向 NameNode 注册,通过后,周期性(1小时)的向 NameNode 上报所有的块信息。
  3. 心跳是每3秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,则认为该节点不可用。

3.2 DataNode 节点保证数据完整性的方法

  1. 当 DataNode 读取 Block 的时候,它会计算 CheckSum。
  2. 如果计算后的 CheckSum,与 Block 创建时值不一样,说明 Block 已经损坏。
  3. Client 读取其他 DataNode 上的 Block。
  4. DataNode 在其文件创建后周期验证 CheckSum。

3.3 掉线时限参数设置

在这里插入图片描述

可以在hdfs-site.xml中进行配置,需要注意的是 hdfs-site.xml配置文件中的heartbeat.recheck.interval 的单位为毫秒,dfs.heartbeat.interval 的单位为秒。

<property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>300000</value>
</property>
<property>
  <name>dfs.heartbeat.interval</name>
  <value>3</value>
</property>

四、白名单(服役新节点)与黑名单(退役旧节点)

4.1 白名单(服役新节点)

当原有的数据节点的容量已经不能满足存储数据的需求,可以在原有集群基础上动态添加新的数据节点。只要在配置文件中配置了 NameNode 的地址,直接启动 DataNode ,即可关联到集群。但是这样并不安全。因为加入方式过于简单,若有不法之徒通过加入了集群获得数据的副本,就有可能给企业、公司造成损失。

我们可以通过白名单,将想要配置的服务器添加到集群。

添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出。

配置白名单具体步骤如下:

1、在 NameNode 的 hdfs-site.xml 配置文件中增加 dfs.hosts 属性(并重启 NameNode)

<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/dfs.hosts</value>
</property>

2、在 NameNode 的/opt/module/hadoop-3.1.3/etc/hadoop目录下创建 dfs.hosts 文件(可自定义名称)。并添加你想要添加进集群的IP地址。例:

hadoop102
hadoop103
hadoop104

3、刷新 NameNode

hdfs dfsadmin -refreshNodes

4、更新ResourceManager节点

yarn rmadmin -refreshNodes

5、在web浏览器上查看修改结果。

4.2 黑名单(退役旧节点)

在业务的过程中,集群中的某些服务器可能需要进行报废处理或是二次售卖,必须让其退出集群,我们可以选择设置黑名单,让其安全退役。

在黑名单上面的主机都会被强制退出。

黑名单配置步骤如下:

1、在 NameNode 的 hdfs-site.xml 配置文件中增加 dfs.hosts.exclude 属性(并重启NameNode)。

<property>
<name>dfs.hosts.exclude</name>
      <value>/opt/module/hadoop-3.1.3/etc/hadoop/dfs.hosts.exclude</value>
</property>

2、在 NameNode 的 /opt/module/hadoop-3.1.3/etc/hadoop 目录下创建 dfs.hosts.exclude 文件。并添加需要退役的服务器IP。

hadoop105

3、刷新NameNode、刷新ResourceManager

hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes

4、检查Web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点

在这里插入图片描述

5、等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役。

在这里插入图片描述

6、关闭服务

hdfs --daemon stop datanode
yarn --daemon stop nodemanager

7、将退役服务器关机拔下来卖了…

五、DataNode多目录配置

​ DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本。

​ 修改 hdfs-site.xml 文件

<property>
        <name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>

​ 在服务器上有多块磁盘时需要进行多目录配置,否则HDFS只会在其中一块硬盘中进行存储,而不会使用其他硬盘。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐