【Hadoop3.3.6】数据块副本放置策略及解析EditLog和FsImage

server/2024/12/23 15:39:32/

目录

    • 一、摘要
    • 二、正文
      • 2.1 环境说明
      • 2.2 网络拓扑
      • 2.3 Hadoop副本放置策略介绍
      • 2.4 解析EditLog和Fsimage镜像文件
    • 三、小结

一、摘要

通过解析存储于NameNode节点上的日志文件EditLog和镜像文件(元数据)Fsimage来反向验证HDFS的数据块副本存放策略,其目的是希望加深对Hadoop的数据块放置策略的理解以及掌握如何查看日志文件及镜像文件的方法和理解其内容。

二、正文

2.1 环境说明

软件说明
VMWareWorkstation版本16.2.+
MobXterm远程连接工具
Hadoop版本3.3.6

2.2 网络拓扑

在这里插入图片描述

2.3 Hadoop副本放置策略介绍

  1. 副本放置机制的意义

    复制副本的放置对HDFS的可靠性和性能至关重要。优化复制副本放置将HDFS与大多数其他分布式文件系统区别开来。这是一个需要大量调整和经验的功能。机架感知复制副本放置策略的目的是提高数据的可靠性、可用性和网络带宽利用率。复制副本放置策略的当前实现是朝着这个方向迈出的第一步。实施此策略的短期目标是在生产系统上对其进行验证,了解更多关于其行为的信息,并为测试和研究更复杂的策略奠定基础。
    大型HDFS实例在通常分布在许多机架上的计算机集群上运行。不同机架中的两个节点之间的通信必须通过交换机。在大多数情况下,同一机架中机器之间的网络带宽大于不同机架中机器间的网络带宽。
    NameNode通过Hadoop rack Awareness中概述的过程确定每个DataNode所属的机架id。一个简单但非最优的策略是将复制副本放置在唯一的机架上。这样可以防止整个机架出现故障时丢失数据,并允许在读取数据时使用多个机架的带宽。此策略在群集中均匀分布复制副本,从而可以轻松平衡组件故障时的负载。但是,此策略增加了写入成本,因为写入需要将块传输到多个机架。

  2. 副本放置机制原理

    对于常见情况,当复制因子为3时,HDFS的放置策略是,如果写入程序位于数据节点上,则将一个副本放置在本地机器上,否则放置在与写入程序位于同一机架中的随机数据节点上、另一个副本放在不同(远程)机架中的节点上,最后一个副本则放在同一远程机架中的不同节点上。此策略可减少机架间写入流量,这通常会提高写入性能。机架故障的几率远小于节点故障的几率;此策略不会影响数据的可靠性和可用性保证。然而,它并没有减少读取数据时使用的聚合网络带宽,因为块只放置在两个唯一的机架中,而不是三个。使用此策略,块的副本不会均匀分布在机架上。两个复制副本位于一个机架的不同节点上,其余复制副本位于其他机架之一的节点上。此策略在不影响数据可靠性或读取性能的情况下提高了写入性能。

    如果复制系数大于3,则随机确定第4个和以下复制副本的位置,同时将每个机架的复制副本数量保持在上限以下(基本上为(复制副本-1)/机架+2)。因为NameNode不允许DataNodes具有同一块的多个副本,所以创建的最大副本数是当时DataNodes的总数。

    在HDFS中添加了对存储类型和存储策略的支持后,除了上述机架意识之外,NameNode还考虑了复制副本放置的策略。NameNode首先根据机架感知来选择节点,然后检查候选节点是否具有与文件相关联的策略所需的存储空间。如果候选节点没有存储类型,则NameNode会查找另一个节点。如果在第一个路径中找不到足够的节点来放置副本,则NameNode会在第二个路径中查找具有后备存储类型的节点。

    总之,当复制因子为3时,HDFS的放置策略是,如果写入程序位于数据节点上,则将一个副本放置在本地机器上,否则放置在与写入程序相同机架中的随机数据节点上、另一个副本放在不同(远程)机架中的节点上,最后一个副本则放置在同一远程机架中的不同节点上。如果复制系数大于3,则随机确定第4个和以下复制副本的位置,同时将每个机架的复制副本数量保持在上限以下(基本上为(复制副本-1)/机架+2)。除此之外,HDFS还支持4种不同的可插拔块放置策略。用户可以根据其基础结构和用例选择策略。
    以下为3副本策略时的副本放置策略示例图:
    在这里插入图片描述

  3. 副本的选择

    为了最大限度地减少全局带宽消耗和读取延迟,HDFS尝试满足来自最接近服务器读取副本的请求。如果在与该节点相同的机架上存在复制副本,则首选该复制副本来满足读取请求。如果HDFS集群跨越多个数据中心,那么驻留在本地数据中心的复制副本优先于任何远程复制副本。

2.4 解析EditLog和Fsimage镜像文件

  1. EditLog文件

    editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。该文件记录了集群运行期间所有对HDFS的相关操作。

  2. Fsimage文件

    fsimage保存了最新的元数据检查点,在HDFS启动时加载fsimage的信息,包含了整个HDFS文件系统的所有目录和文件的信息。
    对于文件来说包括了数据块描述信息、修改时间、访问时间等。
    对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。

  3. EditLog和Fsimage的主要作用

    Fsimage,editlog主要用于在集群启动时将集群的状态恢复到关闭前的状态。为了达到这个目的,集群启动时将Fsimage、editlog加载到内存中,进行合并,合并后恢复完成。

  4. 实验与解析
    为了测试方便,以下是在新安装的hadoop3.3.6全分布式环境上(具体安装请参考博文:Hadoop3.3.6全分布式环境搭建)所在的操作:

    1. 登录到NameNode所在节点

    2. 创建HDFS的目录testdatas

      hdfs dfs -mkdir /testdatas
      
    3. 上传hadoop-3.3.6.tar.gz到testdatas目录下

      上传前先查看hadoop-3.3.6.tar.gz文件大小

      [root@master ~]# ls -lh
      -rw-r--r--. 1 root root 697M Apr 20 21:33 hadoop-3.3.6.tar.gz
      [root@master ~]#
      

      以数据块128M来计算下数据块总数:697M/128M = 5.4,即该文件上传到HDFS上时会被分成6个数据块。

      执行如下命令开始上传:

      hdfs dfs -put hadoop-3.3.6.tar.gz /testdatas
      
    4. 解析EditLog文件
      由于EditLog是二进制文件无法直接打开查看和阅读,需要使用hdfs命令将其转换成可阅读的文件格式再进行阅读,具体执行如下命令进行文件格式的转换:

      [root@master ~]# cd /opt/software/hadoop-3.3.6/tmp/dfs/name/current/
      hdfs oev -i edits_inprogress_0000000000000000008 -o ./edits_inprogress.xml
      

      查看转换后的文件edits_inprogress.xml
      文件内容如下:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <EDITS><EDITS_VERSION>-66</EDITS_VERSION><RECORD><OPCODE>OP_START_LOG_SEGMENT</OPCODE><DATA><TXID>8</TXID></DATA></RECORD><RECORD><OPCODE>OP_MKDIR</OPCODE><DATA><TXID>9</TXID><LENGTH>0</LENGTH><INODEID>16386</INODEID><PATH>/testdatas</PATH><TIMESTAMP>1713672689223</TIMESTAMP><PERMISSION_STATUS><USERNAME>root</USERNAME><GROUPNAME>supergroup</GROUPNAME><MODE>493</MODE></PERMISSION_STATUS></DATA></RECORD><RECORD><OPCODE>OP_ADD</OPCODE><DATA><TXID>10</TXID><LENGTH>0</LENGTH><INODEID>16387</INODEID><PATH>/testdatas/hadoop-3.3.6.tar.gz._COPYING_</PATH><REPLICATION>3</REPLICATION><MTIME>1713672994012</MTIME><ATIME>1713672994012</ATIME><BLOCKSIZE>134217728</BLOCKSIZE><CLIENT_NAME>DFSClient_NONMAPREDUCE_268238562_1</CLIENT_NAME><CLIENT_MACHINE>192.168.85.128</CLIENT_MACHINE><OVERWRITE>true</OVERWRITE><PERMISSION_STATUS><USERNAME>root</USERNAME><GROUPNAME>supergroup</GROUPNAME><MODE>420</MODE></PERMISSION_STATUS><ERASURE_CODING_POLICY_ID>0</ERASURE_CODING_POLICY_ID><RPC_CLIENTID>4b339db6-64fe-4703-8e53-6a510784e347</RPC_CLIENTID><RPC_CALLID>3</RPC_CALLID></DATA></RECORD><RECORD><OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE><DATA><TXID>11</TXID><BLOCK_ID>1073741825</BLOCK_ID></DATA></RECORD><RECORD><OPCODE>OP_SET_GENSTAMP_V2</OPCODE><DATA><TXID>12</TXID><GENSTAMPV2>1001</GENSTAMPV2></DATA></RECORD><RECORD><OPCODE>OP_ADD_BLOCK</OPCODE><DATA><TXID>13</TXID><PATH>/testdatas/hadoop-3.3.6.tar.gz._COPYING_</PATH><BLOCK><BLOCK_ID>1073741825</BLOCK_ID><NUM_BYTES>0</NUM_BYTES><GENSTAMP>1001</GENSTAMP></BLOCK><RPC_CLIENTID/><RPC_CALLID>-2</RPC_CALLID></DATA></RECORD><RECORD><OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE><DATA><TXID>14</TXID><BLOCK_ID>1073741826</BLOCK_ID></DATA></RECORD><RECORD><OPCODE>OP_SET_GENSTAMP_V2</OPCODE><DATA><TXID>15</TXID><GENSTAMPV2>1002</GENSTAMPV2></DATA></RECORD><RECORD>
      

http://www.ppmy.cn/server/19688.html

相关文章

JAVA中应用JWT进行token会话

一、概述 JWT是一种用于身份验证和授权的开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式来在不同系统之间传输信息。JWT由三部分组成&#xff1a;头部&#xff08;Header&#xff09;、负载&#xff08;Payload&#xff09;和签名&#…

iOS(Object C) 选择排序

有一个无序数组,用选择排序法将其排成有序数组 NSMutableArray * array [[NSMutableArray alloc]initWithObjects:"31","22","51","3","2","1","4", nil]; 选择排序的思想: 1.每一轮在无序区选择一…

陪丨玩丨系丨统前后端开发流程,APP小程序H5前后端源码交付支持二开!多人语音,开黑,线上线下两套操作可在一个系统完成!

100%全部源码出售 官网源码APP源码 管理系统源码 终身免费售后 产品免费更新 产品更新频率高 让您时刻立足于行业前沿 软件开发流程步骤及其作用&#xff1a; 软件开发是一个复杂而系统的过程&#xff0c;涉及多个环节&#xff0c;以下是软件开发的主要流程步骤及其作用…

Java设计模式中装饰器模式(套娃)

装饰器模式是一种结构型设计模式&#xff0c;它允许你在不改变对象自身的情况下动态地给对象添加新的功能。这种模式通过将对象放入装饰器对象中&#xff0c;然后将装饰器对象包装在其他装饰器对象中&#xff0c;以实现各种功能的组合。这种模式符合开放封闭原则&#xff0c;即…

基于Springboot+Vue的Java项目-家政服务平台系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

路由嵌套是什么?怎么进行路由嵌套

路由嵌套&#xff1a; 此时我们从一个组件切换到另一个组件时&#xff0c;会直接跳转页面&#xff0c;所以我们需要一个东西让组件们可以在一个页面显示&#xff0c;这时候就需要进行路由嵌套。我们要找到组件之间的关系&#xff0c;大组件嵌套小组件&#xff0c;从大组件中打…

Java设计模式 _创建型模式_建造者模式(Builder)

一、建造者模式 1、建造者模式&#xff08;Builder Pattern&#xff09;是一种创建对象的设计模式。它允许你使用不同的构建策略来创建复杂对象。通常是在复杂类中通过静态内部类&#xff08;Builder&#xff09;来进行构建。 2、实现思路&#xff1a; &#xff08;1&#xf…

Java 线程的几种状态

一、 线程的状态 状态是针对当前的线程调度的情况来描述的。因为线程是调度的基本单位&#xff0c;所以状态更应该是线程的属性。在Java中线程的状态一共有六种&#xff1a; 1. 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。 2. 运行(RUNN…