hdfs四大机制

1 心跳机制

目的:为了实现主节点和从节点的通信。
重点:两个参数和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死亡(宕机)需要103+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两个参数,将其时间延长。

2 安全模式

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

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

元数据包含哪些?

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

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

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

集群启动的时候做哪些事情?
在这里插入图片描述
集群启动的时候:

  1. namenode启动的时候,namenode将元数据加载到内存中
  2. datanode启动的时候,namenode接收datanode的心跳报告
    心跳报告的目的:1)获取datanode的存活状况 2)获取块的存储信息
  3. 启动 secondaryNamenode
    集群在启动的时候不允许外界对集群进行操作,也就是处于安全模式。
    集群在维护和升级时,也可以手动将集群设置为安全模式,注意退出安全模式的方法:
hdfs dfsadmin -safemode -enter 进入安全模式
hdfs dfsadmin -safemode -leave 退出安全模式
hdfs dfsadmin -safemode -get 获取安全模式的状态,即安全模式是否开启。开启返回ON,关闭返回OFF,如下图
hdfs dfsadmin -safemode wait 等待自行退出

在这里插入图片描述
安全模式下用户可以进行的操作:不修改元数据的操作,例如ls查询、cat查看文件内容、get下载等。元数据包含的三部分中,2、3都是由集群决定的,所以用户不能修改的只有1抽象目录树。
不可以进行的操作:修改元数据的操作。例如创建目录、上传、修改文件名、文件追加

发现副本数少了,也需要在启动过程中复制。

3 机架策略

目的:为了数据的安全高效

3.1 机架

如下两图,图1 是抽象后的机架,图2 是真实的机架。
一个服务器中挂载着多个硬盘,一个机架中插入着多个服务器,同一个机架中的服务器,通过该机架内的共享交换机进行通信(例如机架1中的服务器通过交换机1进行通信),不同机架中的服务器通过机架间共享的交换机进行通信(例如机架1中服务器的和机架2中的服务器通过交换机3进行通信)。
一般而言,机架内结点之间的带宽要比跨机架的带宽大。
在这里插入图片描述
在这里插入图片描述

3.2 副本存放机制

默认情况下,每个数据块有三个副本,这三个副本怎么存放呢?
机架充足

  • 第一个副本一般存放在客户端所在的结点上
  • 第二个副本一般存放在与第一个副本不同机架的任意结点上
    原因:防止同一机架断电,数据访问不到
  • 第三个副本一般存放在与第一个副本同一机架的不同结点
    原因:在风险度相同(第三个副本存放在机架1和机架2,机架断电的可能性相同)的情况下,优先选择网络传输少的。

4 负载均衡

每个节点上存放的数据百分比相差很小,能力越大责任越大。例如,有三个结点,各个节点的存储容量为5t、2t、8t,则下面的存储分配情况就达到负载均衡了。

容量存放数据量占比
5t2.5t50%
2t1t50%
8t4t50%

根据机架策略,在上传文件的时候,会优先选择客户端所在节点。如果习惯性地使用同一个客户端,会导致客户端节点的存储的数据比较多。
所以,集群有一个自动进行负载均衡的操作,只是这个操作比较慢,默认的带宽是1M(1048576 byte),在hdfs-default.xml中的参数balance定义了该带宽。就这个速度还是在集群空闲的情况下执行。

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

集群自动的负载均衡在小规模集群中可以,在大规模集群中来不及,所以需要手动进行负载均衡。进入/hadoop-2.7.7/sbin文件夹中,有两个命令start-balancer.shstop-balancer.sh。注意:start-balancer.sh也不会立即执行,而是等集群空闲的时候才执行。

存在绝对的负载均衡?不存在
所以在手动负载均衡的时候可以指定一个参数,start-balancer.sh -t 10%
-t %10指的是任意两个节点之间的存储百分比不超过10%,则认为达到了负载均衡。

什么时候可能导致启动负载均衡?
(1)有Datanode发生故障(2)添加新的节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张之海

若有帮助,客官打赏一分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值