1、心跳机制
1、datanode定期向namenode发送存活状态以及可用空间,默认时间3s
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
<description>Determines datanode heartbeat interval in seconds.</description>
</property>
2、向namenode发送块报告
namenode在内存中的元数据在最初的时候是只包含两个部分(抽象目录树、数据和块的关系),没有块的存储信息,而客户端读取时是需要知道块存储信息的。这部分信息是datanode发送心跳报告时携带的。
namenode确认一个datanode宕机需要630s。namenode连续10次接收不到心跳报告(30s),即主动向datanode发送消息,每次消息间隔5min,连续两次没有响应(5min*2=600s)则认为宕机。
连续接收不到心跳的次数
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>
namenode检查datanode过时的时间,默认5分钟,默认检查2次
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
2、机架策略
决定每一个数据块的副本存放位置
1、多个副本的存放策略(默认3个副本)
1、第一个副本放在与客户端相同的节点上
放置副本上传不成功
最大程度保证可以成功上传到一个节点,如果客户端不是集群中的节点,随机选择一个节点放置第一个副本
2、第二个副本放置在不同机架的节点上
保证数据安全,防止机架整体出故障
3、第三个副本放置在与第二个节点相同的机架的不同节点上
提升数据传输效率
3、负载均衡
hadoop集群中多个datanode中每一个datanode存储的数据的占比相当(与每一个datanode硬件相关)
如果发现集群中datanode节点的负载不均衡的情况下,自动启动负载均衡,将存储占比大的datanode节点上的数据,移动到存储占比小的datanode节点上
节点移动数据块到另一个节点,底层是网络传输,传输完成后删除本节点的数据块
默认带宽是1M/s
带宽调整,默认1M/s
<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>
默认的负载均衡如果集群中的节点很少,默认的负责均衡是可以的;集群中的节点很多时,默认的负载均衡很难达到需求,需要手动启动负载均衡
start-balancer.sh -t 10
1、 这个命令不会立即执行,类似于jvm垃圾回收,是提醒集群空闲的时候,立即执行,加快执行效率
2、-t 10 代表负载均衡最终停止的要求,没有绝对的负载均衡,只有相对的(占比差在可接受的范围)
-t 指定的就是节点存储的最大-最小的占比差 10代表10%
3、手动执行时,配合带宽调整
4、安全模式
集群的一种自我保护模式,namenode决定
1、什么时候进入安全模式
1、集群启动时,启动namenode和datanode过程中,namenode 的元数据一直 处于完善状态,这个时候集群不能对外提供服务,进入安全模式
2、集群运行过程中也可能进入安全模式
1、集群的块的汇报率<99.9%
2、datanode节点个数小于配置要求的时候
3、namenode的元数据的存储目录的大小 <100M
2、什么时候离开安全模式
1、数据块的汇报率(每一个数据块至少保证一个副本)达到>=99.9%
2、datanode的节点个数达到配置要求的时候,默认是0个
3、当前两个条件都满足的时候,保证安全模式30s,保证集群数据汇报稳定的时候
4、保证namenode元数据的文件夹的存储预留达到100M(配置的namenode相关数据的存储目录)
同时满足四个条件才会离开安全模式
3、集群处于安全模式的时候,对元数据相关信息做哪一些检查?
集群在整个启动过程中处于安全模式的,进行一系列的检查,符合标准的时候,才会离开安全模式:
1)检查每一个数据块的最小副本个数,每一个数据块的副本个数至少为1
<property>
<name>dfs.namenode.replication.min</name>
<value>1</value>
<description>Minimal block replication.
</description>
</property>
2)检查合乎标准的数据块占总数据块的比例 (可用数据块的汇报率)
<property>
<name>dfs.namenode.safemode.threshold-pct</name>
<value>0.999f</value>
<description>
Specifies the percentage of blocks that should satisfy
the minimal replication requirement defined by dfs.namenode.replication.min.
Values less than or equal to 0 mean not to wait for any particular
percentage of blocks before exiting safemode.
Values greater than 1 will make safe mode permanent.
</description>
</property>
假设集群中的总的数据块的id:1000个
达到副本个数>=1的数据块的id:999 达标的数据块的比例999/1000=0.999
达到副本个数>=1的数据块的id:998 比例:0.998
3)检查存活的datanode个数
<property>
<name>dfs.namenode.safemode.min.datanodes</name>
<value>0</value>
<description>
Specifies the number of datanodes that must be considered alive
before the name node exits safemode.
Values less than or equal to 0 mean not to take the number of live
datanodes into account when deciding whether to remain in safe mode
during startup.
Values greater than the number of datanodes in the cluster
will make safe mode permanent.
</description>
</property>
至少保证0个datanode存活的
4)整个符合上面的标准的状态持续30s之后 (安全模式停留时长)
<property>
<name>dfs.namenode.safemode.extension</name>
<value>30000</value>
<description>
Determines extension of safe mode in milliseconds
after the threshold level is reached.
</description>
</property>
保证集群的稳定性
5)资源占有空间(检查元数据存储的文件夹的大小)
<property>
<name>dfs.namenode.resource.du.reserved</name>
<value>104857600</value>
<description>
The amount of space to reserve/require for a NameNode storage directory
in bytes. The default is 100MB.
</description>
</property>
4、手动进入安全模式
一般情况下,集群升级(维护)的时候,一般将集群强制进入安全模式
hdfs dfsadmin -safemode get(查看当前安全模式)/leave(离开安全模式)/enter(进入安全模式)/wait
5、在安全模式下,不是所有的操作都不能执行的
-ls -get -cat -tail 都是与查询相关的操作,只要不修改元数据的操作都可以执行
-put -mkdir -touchz -rm 不可执行的操作