在https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html上有以下单词:
DataNodes配置了两个NameNode的位置,并向两者发送块位置信息和心跳.
但为什么这些信息被发送到namenode及其后备兄弟?我认为这个信息已经包含在namenode的fs图像中.namenode应该知道他放置块的位置.
名称节点包含整个群集的元数据.它包含每个文件夹,文件,复制因子,块名称等的详细信息.名称节点还在内存中存储有关每个文件的块位置的信息(此信息由数据节点发送的块报告构成) .
数据节点存储每个块的以下信息:
存储在块中的实际数据
存储在块中的数据的元数据.主要包含块中存储的数据的校验和.
他们定期将心跳和阻止报告发送到名称节点.
心跳:
心跳报告的间隔由配置参数dfs.heartbeat.interval
(在hdfs-site.xml中)确定.默认情况下,此值设置为3秒.
心跳中包含的一些信息是:
注册:数据节点注册信息
容量:数据节点上可用的总存储容量
dfsUsed:HDFS使用的存储
剩余:可用于HDFS的剩余存储空间
blockPoolUsed:块池使用的存储
xmitsInProgress:从此数据节点到其他节点的传输次数
xceiverCount:活动收发器线程数
xmitsInProgress:从此数据节点到其他节点的传输次数
cacheCapacity:数据节点上可用的总缓存容量
cacheUsed:使用的缓存量
名称节点以下列方式使用此信息:
数据节点的运行状况:此数据节点是否应标记为死或活?
注册新数据节点:如果这是新添加的数据节点,则注册其信息
更新数据节点的度量标准:心跳中发送的信息用于更新节点的度量标准
向数据节点发出命令:名称节点可以根据心跳中收到的信息向数据节点发出以下命令:( BlockRecoveryCommand
用于恢复指定的块),BlockCommand
(用于将块传输到另一个数据节点,用于使某些块无效) ,Cache/Uncache
(用于缓存/解除块的命令)
阻止报告:
块报告的间隔由配置确定dfs.blockreport.intervalMsec
(在hdfs-site.xml中).默认情况下,此值设置为21600000毫秒.
块报告中包含的一些信息是:
注册:数据节点注册信息
blocks:有关块的信息,包括:块ID,块长度,块生成时间戳,块副本的状态(例如,副本已完成或等待恢复等)
名称节点使用此信息:
处理第一个块报告:如果它是新注册的数据节点的第一次报告,它只添加所有有效的副本.它忽略所有无效块,直到下一个块报告.
要更新有关块的信息:(数据节点 - >块)映射在名称节点中更新.将新块报告与旧报告进行比较,并更新有关成功块,损坏块,无效块等的信息