Hadoop–HDFS四大机制


文章目录

  • Hadoop--HDFS四大机制
  • 一:心跳机制
  • 二:机架策略
  • 三:安全模式
  • 问题引出:
  • namenode 进入安全模式的原理:
  • 正常启动的时候进入安全模式的原理:
  • 四:负载均衡
  • 1) 保证动态的均衡(不均衡会影响集群性能)
  • 2) 如何手动实现负载均衡?(移动block块 --> 整个集群性能)
  • 1.设置峰值和谷值之间的差
  • 2.设置阈值(达到这个阈值才会负载均衡) 默认10,一般设置越小
  • 3.设置带宽(负载均衡一般会严格控制带宽) 1m/s*3600*24


一:心跳机制

hadoop集群启动的时候各个进程启动的顺序

  • namenode:
  • datanode
  • secondarynamenode

namenode 管理 datanode 空间块信息,从datanode 定期向 namenode 进行发送 心跳报告,目的:

  • 向namenode汇报自己的存活状态 空间
  • 向namenode汇报自己的块信息

集群节点之间必须做时间同步:

namenode负责集群上任务的分工,如果要进行分工,则必须知道各个从节点的存活状况,namenode通过datanode定期向namenode发送的心跳报告得知的,datanode默认每隔3秒发送一次心跳报告

namenode什么时候才会判定datanode死了:

datanode每隔3秒向namenode发送一次心跳报告,当namenode连续十次没有收到datanode的心跳报告,则认为datanode可能死了,这时namenode主动向datanode发送一个检查,发送一次检查的时间默认是5min,namenode 给自己两次机会,如果一次检查没有返回信息,这时namenode 会再次进行检查,如果两次检查都没有返回信息,则会判定当前的datanode已经死了,也就是说namenode最终判断datanode死了需要2 * 5min + 3s*10 = 630s

hdfs通过配置文件可以修改发送心跳信号的时间和判断是否宕机

<property>   
	<!--dfs 心跳  间隔-->   
	<name>dfs.heartbeat.interval</name>   
	<!--3秒-->  
	<value>3</value>   
	<description>Determines datanode heartbeat interval in seconds.</description> 
</property> 

如果连续十次心跳信号接受不到datanode的心跳信号,会认为datanode可能宕机了  
namenode 会主动发送检查  检查一次的时间

<property> 
	<name>dfs.namenode.handler.count</name>  
	<value>10</value>  
	<description>The number of server threads for the namenode.</description>
</property> 

检查一次的时间   300s = 5min 
允许检查2次   2*5min  = 10min 

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

二:机架策略

HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。通过一个机架感知的过程,Namenode可以确定每个Datanode所属的机架id

hadoop 运行后特别卡 hadoop运行机制_负载均衡

副本存放机制(默认情况下,每个数据块有3个副本)

三个副本的存放情况:

  • 第一份副本存放在客户端所在的节点上
  • 第二个副本存储在和第一个副本不同的机架的任意一个节点上(防止整个机架断电,数据访问不到)
  • 第三个副本存储在与第一个副本不同的机架上的不同的节点上(在风险度相同的情况下,优先选择网络传输少的)

真实情况下需要手动配置机架策略

自定以机架策略需要考虑:

  • 不同节点
  • 不同机架
  • 不同数据中心

三:安全模式

问题引出:

集群启动后,可以查看目录,但是上传文件时报错,打开web页面可看到namenode正处于 safemode 状态,怎么处理?

解释:safemode 是 namenode 的一种状态(active(活跃)/standby(热备)/safemode 安全模式)

namenode 进入安全模式的原理:

a、 namenode 发现集群中的 block 丢失率达到一定比例时(0.1%),namenode 就会进入安全模式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息(比这个丢失率是可以手动配置的,默认是 dfs.safemode.threshold.pct=0.999f

b、如何退出安全模式?

1、找到问题所在,进行修复(比如修复宕机的 datanode)

2、或者可以手动强行退出安全模式(但是并没有真正解决问题)

在 hdfs 集群正常冷启动时,namenode 也会在 safemode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可

c.在安全模式下哪些操作可以执行,哪些不可以执行?

修改元数据的操作都不可以执行:创建文件夹,上传,文件删除需要修改元数据,不可以执行(例如mkdir,rm,put )。 查看,下载仅仅是读取元数据,可以执行(例如:ls,cat,get)。

正常启动的时候进入安全模式的原理:

(原理:namenode 的内存元数据中,包含文件路径、副本数、blockid,及每一个 block 所在datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式——>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息,——>随着datanode 陆续启动,从而陆续汇报 block 信息,namenode 就会将内存元数据中的 block 所在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式)

安全模式常用操作命令:

hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode get //查看安全模式状态
hdfs dfsadmin -safemode wait //等待,一直到安全模式结束

四:负载均衡

1) 保证动态的均衡(不均衡会影响集群性能)

2) 如何手动实现负载均衡?(移动block块 --> 整个集群性能)

start-balancer.sh

1.设置峰值和谷值之间的差
start-balancer.sh -t 10% (峰值和谷值之间的差距)//当差距达到10%就自动开启负载均衡
2.设置阈值(达到这个阈值才会负载均衡) 默认10,一般设置越小
sbin/start-balancer.sh -threshold 5
3.设置带宽(负载均衡一般会严格控制带宽) 1m/s360024
hdfs dfsadmin -setBalanacerBandwidth 10485760(10m/s)

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