为什么datanode将块位置信息发送给namenode?

x4shl7ld  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(366)

上https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfshighavailabilitywithnfs.html 有几个词:
datanodes配置了两个namenodes的位置,并向这两个节点发送块位置信息和心跳信号。
但为什么要将此信息发送到namenode及其回退兄弟?我认为这个信息已经包含在namenode的fs映像中了。namenode应该知道他把块放在哪里。

smdnsysy

smdnsysy1#

name节点包含整个集群的元数据。它包含每个文件夹、文件、复制因子、块名称等的详细信息。名称节点还将有关每个文件的块位置的信息(此信息由数据节点发送的块报告构造)存储在内存中。
数据节点为每个块存储以下信息:
块中存储的实际数据
块中存储的数据的元数据。主要包含块中存储的数据的校验和。
它们定期向name节点发送心跳和阻塞报告。
心跳:
心跳报告的间隔由配置参数决定 dfs.heartbeat.interval (在hdfs site.xml中)。默认设置为3秒。
心跳中包含的一些信息是:
注册:数据节点注册信息
容量:数据节点上可用的总存储容量
dfsused:hdfs使用的存储
剩余:hdfs可用的剩余存储
blockpoolused:块池使用的存储
xmitsinprogress:从此数据节点到其他节点的传输数
xceivercount:活动收发器线程数
xmitsinprogress:从此数据节点到其他节点的传输数
cachecapacity:数据节点上可用的总缓存容量
cacheused:使用的缓存量
名称节点使用此信息的方式如下:
数据节点的运行状况:是否应将此数据节点标记为死节点或活节点?
注册新数据节点:如果是新添加的数据节点,则注册其信息
更新数据节点的度量:心跳中发送的信息用于更新节点的度量
向数据节点发出命令:name节点可以根据心跳中接收到的信息向数据节点发出以下命令: BlockRecoveryCommand (恢复指定的块), BlockCommand (用于将块传输到另一个数据节点,用于使某些块无效), Cache/Uncache (用于缓存/取消缓存块的命令)
阻止报告:
块报告的间隔由配置决定 dfs.blockreport.intervalMsec (在hdfs site.xml中)。默认设置为2160000毫秒。
区块报告中包含的一些信息是:
注册:数据节点注册信息
块:有关块的信息,包括:块id、块长度、块生成时间戳、块副本的状态(例如,副本已完成或等待恢复等)
名称节点将此信息用于:
处理第一块报告:如果是新注册数据节点的第一次报告,则只添加所有有效副本。它忽略所有无效的块,直到下一个块报告。
用于更新有关块的信息:在名称节点中更新(数据节点->块)Map。将新的块报告与旧报告进行比较,并更新有关成功块、损坏块、无效块等的信息

6qftjkof

6qftjkof2#

数据节点不能从集群外部直接访问,它位于专用网络中。hadoop集群容易发生节点故障,namenode跟踪不同datanode上的所有数据。因此,对集群的任何查询都由nn寻址,并在dn上提供块地址。

相关问题