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

news2024/11/16 5:48:14

目录

    • 一、摘要
    • 二、正文
      • 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.coloradmin.cn/o/1616430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AJAX——同步代码和异步代码

1.同步代码 同步代码&#xff1a;浏览器是按照我们书写代码的顺序一行一行地执行程序的。浏览器会等待代码的解析和工作&#xff0c;在上一行完成后才会执行下一行。这样做是很有必要的&#xff0c;因为每一行新的代码都是建立在前面代码的基础之上的。 这也使得它成为一个同步…

ubuntu快捷更pip源

py安装: apt-get install python3-pip终端输入: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

图论基础知识 深度搜索(DFS,Depth First Search),广度搜索(BFS,Breathe First Search)

图论基础知识 学习记录自代码随想录 dfs 与 bfs 区别 dfs是沿着一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到搜不下去了&#xff0c;再换方向&#xff08;换方向的过程就涉及到了回溯&#xff09;。 bfs是先把本节点所连接的所有节点遍历一遍&#xff0c;走到下…

【React】Day6

项目搭建 基于CRA创建项目 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start调整项目目录结构 -src-apis 项目接口函数-assets 项目资源文件&…

JavaEE初阶——多线程(六)——线程池

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第六篇文章,关于线程池 如果有不足的或者错误的请您指出! 目录 3.线程池3.1标准库的线程池3.2 标准库自己提供的几个工厂类3.3自己实现一个线程池完成大体框架接下来完…

Hive架构原理

Hive Hive 的架构是设计用于在大数据环境下进行数据仓库操作和分析的系统。它建立在 Hadoop 生态系统之上&#xff0c;利用 Hadoop 的存储&#xff08;HDFS&#xff09;和计算&#xff08;MapReduce、Tez、Spark 等&#xff09;能力。 1. 元数据存储&#xff08;Metastore&am…

go语言并发实战——日志收集系统(六) 编写日志收集系统客户端

上节回顾 在上一篇文章中我们介绍了编写客户端的四个步骤&#xff0c;分别是&#xff1a; 读取配置文件&#xff0c;寻找日志路径初始化服务根据日志路径l来收集日志将收集到的日志发送Kafka中 关于上述的内容博主画了一个思维导图(有点丑&#xff0c;大家勉强看看&#xff0…

iOS - 多线程-GCD

文章目录 iOS - 多线程-GCD1. 常见多线程方案2. GCD2.1 GCD的常见函数GCD中有2个用来执行任务的函数 2.2 GCD的队列2.2.1 GCD的队列可以分为2大类型 2.3 容易混淆的术语2.4.1 有4个术语比较容易混淆&#xff1a;同步、异步、并发、串行 2.4 各种队列的执行效果 3. 死锁3.1 死锁…

鸿蒙开发模拟器的坑, No Devices

问题 我已经安装了模拟器&#xff0c;并且模拟器已经运行了 在Device Manager页面开启模拟器 No Devices 但是这里没有模拟器的选项 解决 添加环境变量 下面步骤 1、清除用户数据 2、 关闭Device Manager 3、 关闭ide 重启ide、开启模拟器 看到有模拟器的选项了

【数据结构|C语言版】算法效率和复杂度分析

前言1. 算法效率2. 大O的渐进表示法3. 时间复杂度3.1 时间复杂度概念3.2 时间复杂度计算举例 4. 空间复杂度4.1 空间复杂度的概念4.2 空间复杂度计算举例 5. 常见复杂度对比结语 ↓ 个人主页&#xff1a;C_GUIQU 个人专栏&#xff1a;【数据结构&#xff08;C语言版&#xff09…

光伏仿真设计需要用到的工具有哪些?

随着全球能源结构的转型和可持续发展战略的深入实施&#xff0c;光伏发电作为一种清洁、可再生的能源形式&#xff0c;正日益受到广泛关注和应用。在光伏系统的设计和优化过程中&#xff0c;光伏仿真设计工具发挥着至关重要的作用。那么&#xff0c;光伏仿真设计需要用到的工具…

Opencv_3_图像对象的创建与赋值

ColorInvert.h 如下&#xff1a; #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void mat_creation(); }; ColorInvert.cpp 文件如下&#xff1a; #include &q…

【oceanbase】安装ocp,ocp部署oceanbase

https://www.oceanbase.com/docs/common-ocp-1000000000584989 资源 iphostnamecpumem组件192.168.0.71obnode-000-071816oceanbase-ce192.168.0.72obnode-000-072816oceanbase-ce192.168.0.73obnode-000-073816oceanbase-ce192.168.0.74obproxy-000-07424obproxy-ce192.168.0…

springcloud Ribbon的详解

1、Ribbon是什么 Ribbon是Netflix发布的开源项目&#xff0c;Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的框架。 2、Ribbon能干什么 LB负载均衡(Load Balance)是什么&#xff1f;简单的说就是将用户的请求平摊的分配到多个服务上&#xff0c;从而达…

Redis入门到通关之数据结构解析-ZipList

文章目录 ☃️概述☃️ZipListEntry☃️Encoding编码☃️ZipList的连锁更新问题☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与…

STM32H750外设ADC之模拟窗口看门狗

目录 概述 1 相关寄存器 2 功能描述 3 AWDx 标志和中断 4 模拟看门狗 1 4.1 模拟看门狗 1 说明 4.2 模拟看门狗通道选择 4.3 阀值选择 5 模拟看门狗 2和3 6 ADCx_AWDy_OUT 信号输出生成 6.1 功能介绍 6.2 输出信号案例 7 模拟看门狗 1、 2、 3 比较 概述 本文主…

深度学习从入门到精通—Transformer

1.绪论介绍 1.1 传统的RNN网络 传统的RNN&#xff08;递归神经网络&#xff09;主要存在以下几个问题&#xff1a; 梯度消失和梯度爆炸&#xff1a;这是RNN最主要的问题。由于序列的长距离依赖&#xff0c;当错误通过层传播时&#xff0c;梯度可以变得非常小&#xff08;消失…

MATLAB中左边的大括号最后一行为什么会留很大的空白——解决

看了一些帖子说改字体&#xff0c;但是并没有什么用&#xff0c;在此给出亲测有效的方法&#xff1a;改变矩阵的行间距 先说一下问题 上图中留有大块空白 **解决办法&#xff1a;**光标放在矩阵上 格式——矩阵——更改矩阵&#xff0c;在矩阵设置中选中“行高相等”&#xff…

基于Springboot的学生毕业离校系统

基于SpringbootVue的学生毕业离校系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 网站首页 离校流程 网站公告 留言反馈 后台登录 学生管理 教师管理 离校流程…

【UI】element-ui的el-dialog的遮罩层在模态框的前面bug

最近在写element ui 的时候使用dialog组件&#xff0c;偶然出现了这种情况 原因&#xff1a; 是因为遮罩层插入进了body标签下&#xff0c;z-index高于当前父元素。 解决&#xff1a;在el-dialog标签里加上:modal-append-to-body"false"就可以了。 饿了么官网文档&a…