hdfs的四大机制详解

hadoop 同时被 3 个专栏收录
22 篇文章 0 订阅
2 篇文章 0 订阅
10 篇文章 0 订阅

心跳机制

目的:

为了实现主节点和从节点的通信

重点:

两个参数和namenode判定datanode宕机所需的时间

因为hdfs具有心跳机制,所以在搭建分布式集群时,必须进行时间同步。
心跳机制的原因:namenode是集群中的老大,负责进行任务分工,要进行分工,必须知道各个datanode结点的存活状态。
namenode怎么 知道datanode的存活状态?datanode每隔一定时间向namenode发送一次心跳报告,目的就是告诉namenode自己的存活状态。
这个时间间隔默认是3秒,在hdfs-default.xml中设置,由参数dfs.heartbeat.interval:

 

<property>
  <name>dfs.heartbeat.interval</name>
  <value>3</value>
  <description>Determines datanode heartbeat interval in seconds.</description>
</property>

namenode什么时候判定datanode死亡?
datanode每隔3秒向namenode发送心跳报告,如果namenode连续10次没有收到datanode的心跳报告,则认为datanode可能死了,但是并没有断定其死亡(namenode还需去验证)。这个时候,namenode向datanode发送一次检查,发送一次检查的时间是5min,如果一次检查没有返回信息,namenode还会再进行一次检查,如果再没有收到信息,namenode就认为该datanode死亡。
所以,namenode最终判断datanode死亡(宕机)需要10*3+560*2 = 630秒。

<property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>300000</value>
  <description>
    This time decides the interval to check for expired datanodes.
    With this value and dfs.heartbeat.interval, the interval of
    deciding the datanode is stale or not is also calculated.
    The unit of this configuration is millisecond.
  </description>
</property>

如果集群不稳定,可以更改dfs.heartbeat.interval和dfs.namenode.heartbeat.recheck-interval两个参数,将其时间延长。

最终namenode判断一个datanode死亡的时间计算公式:
timeout = 10 * 心跳间隔时间 + 2 * 检查一次消耗的时间
心跳间隔时间
配置参数:dfs.heartbeat.interval
默认值:3s,单位s
检查一次消耗的时间
配置参数:dfs.namenode.heartbeat.recheck-interval
默认值:    300000,单位ms


 安全模式 

 

运行场景


hdfs启动的时候、集群在维护或升级的时候,为了防止数据丢失,启动安全模式。

2.1 hdfs启动的时候需要做哪些事情?

元数据包含哪些?

(1)抽象目录树
(2)数据和块的映射关系
(3)一个文件对应一个块,例如hadoop.tar.gz 对应块 blk_4262727 blk_6271281。
数据块存储的位置信息


元数据存储的位置在哪儿?

内存
读写快(内存读写基于电流,磁盘读写基于磁道),但是一旦关机就会造成数据丢失,所以元数据既在内存存储,又在磁盘存储。内存中存储1、2。
备注:开机前内存中是没有数据的,开机后将磁盘中的元数据1、2加载到内存中,通过datanode的心跳机制获取元数据3.
磁盘
元数据如果存储在磁盘,那么每次进行文件读写,都需要进行磁盘io,会造成读写的性能比较低。所以,集群在启动后,文件读写的元数据应该不在磁盘中。磁盘中存储1、2。没有 3)块的存储位置。

集群启动后的操作:

将在磁盘内的元数据加载带内存中来,如果磁盘元数据文件过来,先加载1.2部分数据。加载到内存中。启动时namenode会接受心跳数据。数据在DataNode中通过心跳数据传输发送到namenodes中,进程启动顺序:namenode>>>>>datanode>>>>>secondarynamenode

  1. namenode启动的时候,namenode将元数据加载到内存中
  2. datanode启动的时候,namenode接收datanode的心跳报告。心跳报告的目的:1)获取datanode的存活状况 2)获取块的存储信息(重要)
  3. 进行检查块的完整度,进行缺的块的复制工作。在这个期间,集群不对外提供服务的,集群处于安全模式,安全模式下用户不能对集群进行操作。
    如果说在这个期间,集群的块报告有99.99%正常,集群会自动退出安全模式。安全模式下集群处于一个自我保护的状态,会进行块的检查和复制的工作
  4. 手动进入安全模式:hdfs dfsadmin -safemode enter 进入安全模式/leave 离开安全模式/wait 等待安全模式退出/get 获取当前安全模式的状态
  5. 修改元数据的操作都不可以执行:创建文件夹,上传,文件删除需要修改元数据,不可以执行。例如mkdir,rm,put
  6. 查看,下载仅仅是读取元数据,可以执行。例如:ls,cat,get

启动 secondaryNamenode
集群在启动的时候不允许外界对集群进行操作,也就是处于安全模式。
集群在维护和升级时,也可以手动将集群设置为安全模式,注意退出安全模式的方法:

hdfs dfsadmin -safemode -enter 进入安全模式
hdfs dfsadmin -safemode -leave 退出安全模式
hdfs dfsadmin -safemode -get 获取安全模式的状态,即安全模式是否开启。开启返回ON,关闭返回OFF,如下图
hdfs dfsadmin -safemode wait 等待自行退出

机架策略

hdfs存储块副本份数,默认情况的下:副本3分。相同的副本不可能存储在同一个节点上,存在一个节点没有意义。

1)第一份副本放在客户端所在机器,如果客户端不是集群中的节点 任意选一台存放

2)第二个副本放在和第一个副本不同机架的任意节点上。目的是:怕机架断电

3)第三个副本放在与第二个副本相同机架的不同节点上

实际生产中的机架策略:实际生产中机架很多个,数据中心也可能有很多,备份的数据中心。从不同节点,不同机架,不同数据中心去记忆,主要思想是用空间换数据安全

负载均衡

1.集群中的每个节点存储的数据的压力均衡的。负载均衡与硬件配置有关。
正常情况下,集群可以自动实现负载均衡,集群会在集群空闲的时候进行负载均衡。

2.默认情况下集群在进行自动负载均衡的时候的带宽默认最大是1M,集群在进行自动负载均衡的时候是很慢的

        <property>
            指定集群进行自动负载均衡的最大带宽
          <name>dfs.datanode.balance.bandwidthPerSec</name>
          <value>1048576</value>
          <description>
                Specifies the maximum amount of bandwidth that each datanode
                can utilize for the balancing purpose in term of
                the number of bytes per second.
          </description>
        </property>

3.集群规模比较小(20节点)的时候可以依赖集群的自动负载均衡,当集群的规模比较大的时候,依赖集群的自动的负载均衡就太慢了,我们可以手动启动负载均衡

(1)使用命令:start-balancer.sh,这个命令不会立即执行,只是 通知集群及时进行负载均衡

(2)调大集群负载均衡的带宽
            <property>
                    指定集群进行自动负载均衡的最大带宽
                 <name>dfs.datanode.balance.bandwidthPerSec</name>
                 <value>1048576</value>
                <description>
                 Specifies the maximum amount of bandwidth that each datanode
                 can utilize for the balancing purpose in term of
                 the number of bytes per second.
                </description>
            </property>

(3)start-balancer.sh -t 10%
    -t 10%: 任意节点在进行负载均衡的时候,最大节点的的容量占比-最小节点的容量占比不超过10%,就默认集群的负载已经均衡了,例如:在此条件下,如下集群是负载均衡的
            hadoop01    8T        4T         50%
            hadoop02    4T        2.1T       52.5%
            hadoop03    6T        3.2T       53.3%
            3.3%

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

无香菜不欢

谢谢鼓励

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值