• 心跳机制
  • 机架策略
  • 负载均衡
  • 安全模式

心跳机制

  • hdfs主从架构 主namenode 从datanode

    在hdfs的整个运行过程中需要datanode定时的向namenode发送心跳报告
    namenode可通过心跳报告确定datanode是可以正常工作的

发送心跳报告的作用

  1. 报告自己的存活状况
  2. 报告自己的块信息

    心跳报告的周期:3s不能过长 不能太短

    每隔3s datanode会向namenode发送一个心跳报告

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

判断宕机的条件

namenode如何判断一个datanode宕机了?

  • 连续的10次心跳报告接受不到
  • 连续30s接受不到datanode的心跳认为datanode可能宕机,不能判定宕机
  • namenode会主动的向datanode发送检查:300000ms=300s=5min
1
2
3
4
5
6
7
8
9
10
<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>

默认情况下 检查2次 10min 断定datanode宕机了

断定datanode宕机的时间

1
2
namenode断定datanode宕机的时间
10*3s+2*5min=630s

datanode 8次没有心跳 第九次有心跳了 第十次又没有心跳了

  • 重新记录时间

安全模式

元数据

  1. 抽象目录树
  2. 数据和块的对应关系
  3. 数据块的存储位置
1
2
3
4
5
/hadoop-2.7.6.tar.gz   200M

1) 抽象目录树 /hadoop-2.7.6.tar.gz
2)数据和块的对应关系 /hadoop-2.7.6.tar.gz blk12300001:[] blk12300002:[]
3) 元数据的第三部分 存储是一个空的列表 这个列表通过datanode向namenode发送的心跳包 进行填充的

元数据存储的位置

硬盘上

元数据包括:1) 2) 不包含3)

磁盘的读写的缺点:慢 性能瓶颈

内存中

元数据 包括 1) 2) 3)最新的最全的元数据

速度快

从硬盘加载元数据

内存中的元数据 从硬盘中加载过来的
硬盘中的元数据包含1) 2)

1
2
3
4
5
6
7
8
9
10
11
/hadoop-2.7.6.tar.gz   200M

1) 抽象目录树 /hadoop-2.7.6.tar.gz
2)数据和块的对应关系 /hadoop-2.7.6.tar.gz blk12300001:[] blk12300002:[]
3) 元数据的第三部分 存储是一个空的列表 这个列表通过datanode向namenode发送的心跳包 进行填充的datanode向namenode发送心跳包的时候 发送一个自己的块报告

hadoop01:[blk12300001 blk12300003 blk12300005]

接受到datanode的心跳包后 数据块的对应信息的存储位置就知道了
/hadoop-2.7.6.tar.gz blk12300001:[hadoop01,hadoop02]

集群启动顺序

1
namenode----》datanode-----》secondarynamenode

集群启动中namenode进行:

1
2
3
4
5
1)将硬盘中的元数据加载到内存中
2)接受datanode的心跳报告 1)判断datanode的存活率 2)加载块的存储节点信息

这个过程中namenode处于安全模式的 集群也是处于安全模式的---集群的一个自我保护的模式
集群处于安全模式的时候不对外提供服务的 不对外提供写服务 对外提供读的服务

自动离开安全模式的依据:

datanode节点的启动的个数

默认情况下 集群中的datanode节点启动0个也可以离开安全模式

1
2
3
4
5
6
7
8
9
10
11
12
13
<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>

数据块(排除副本)的汇报情况

集群处于安全模式的时候 每一个数据块的副本最小保证个数 默认1个

1
2
3
4
5
6
<property>
<name>dfs.namenode.replication.min</name>
<value>1</value>
<description>Minimal block replication.
</description>
</property>

所有数据块的存活率(不考虑副本的)

假设集群中 10000个数据块 至少0.999*10000=9990个数据块正常的才能离开安全模式

如果数据块少于这个数 这个时候集群一直处于安全模式

1
2
3
4
5
6
7
8
9
10
11
<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>

安全模式的命令

手动进入和离开安全模式的命令

1
2
3
4
5
hdfs dfsadmin -safemode enter/leave/get/wait
enter 进入安全模式
leave 离开安全模式
get 获取安全模式的状态
wait 等待离开安全模式

安全模式下的读写

集群处于安全模式 哪些事情可以做 哪些事情不可以做?

读的操作 不修改元数据的操作

1
2
3
4
5
6
7

hadoop fs -ls / 可以
hadoop fs -cat / 可以
hadoop fs -tail / 可以
hadoop fs -get / /
不修改元数据的操作都可以进行

写的操作 修改元数据信息

1
2
3
4
hadoop fs -mkdir /
hadoop fs -put / /
hadoop fs -rm -r -f /
需要修改元数据的操作 都不可以进行的

机架策略

副本存放策略:

默认2个机架的时候 3个副本的情况下

  • 机架:存放服务器的
    1. 第一个副本存放在客户端所在节点(客户端是集群中的某一个节点)
      如果客户端不是集群中的某一个节点 任意存储
    2. 第二个副本存储在与第一个副本不同机架的任意节点上
    3. 第三个副本存储在与第二个副本相同机架的不同节点上
  • 实际生产上:
    • 不同节点
    • 不同机架
    • 不同机房
    • 不同数据中心

负载均衡

hdfs来说 负载均衡指的是每一个datanode节点上存储的数据和他的硬件匹配

  • 实际上说的是占有率相当
  • 集群如果没有处于负载均衡的时候 集群会自动进行负载均衡的
  • 集群规模的比较小的情况下 20个节点以下 自动进行负载均衡就可以了
1
2
3
4
5
假设有7T数据,负载均衡的情况:
节点 容量 使用 占有率
datanode01 8T 2T 25%
datanode02 4T 1T 25%
datanode03 16T 4T 25%

负载均衡的过程

说白了就是数据块的移动的过程 肯定跨节点 跨机架 需要网络传输
下面的参数 集群自动进行负载均衡的带宽 很慢 默认1M/s

1
2
3
4
5
6
7
8
9
<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>

手动进行负载均衡

集群的规模比较大的时候:1000个节点

自动进行负载均衡 太慢了

加大负载均衡的带宽

1
2
3
4
5
6
7
8
9
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>104857600000</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>

告诉集群及时进行负载均衡

不存在绝对的负载均衡

1
2
3
# 这个命令提交的时候不会立即执行  类似于java中的垃圾回收
# 集群空闲的时候进行负载均衡 提升集群负载均衡的效率的
start-balancer.sh -t 10% # 指定的是负载均衡的评价标准

-t 10%: 最大的节点的占有百分比 和最小节点占有的百分比差值 不能超过10%