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

时间:2015-12-11 16:46:05

标签: hadoop hdfs

https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html上有单词:

  

DataNodes配置了两个NameNode的位置,并向两者发送块位置信息和心跳。

但为什么这些信息被发送到namenode及其后备兄弟?我认为这个信息已经包含在namenode的fs图像中。 namenode应该知道他放置块的位置。

2 个答案:

答案 0 :(得分:6)

名称节点包含整个群集的元数据。它包含每个文件夹,文件,复制因子,块名称等的详细信息。名称节点还在内存中存储有关每个文件的块位置的信息(此信息由数据节点发送的块报告构成)

数据节点存储每个块的以下信息:

  • 存储在块中的实际数据
  • 存储在块中的数据的元数据。主要包含存储在块中的数据的校验和。

他们会定期将心跳和阻止报告发送到名称节点。

心跳

  • 心跳报告的间隔由配置参数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毫秒。
  • 块报告中包含的一些信息是:
    • 注册:数据节点注册信息
    • :有关块的信息,包括:块ID,块长度,块生成时间戳,块副本的状态(例如,副本已完成或等待恢复等)< / LI>
  • 此信息由名称节点用于:
    • 处理第一个阻止报告:如果是新注册的数据节点的第一次报告,则只添加所有有效副本。它忽略所有无效块,直到下一个块报告。
    • 用于更新有关块的信息:在名称节点中更新(数据节点 - &gt;块)地图。将新块报告与旧报告进行比较,并更新有关成功块,损坏块,无效块等的信息。

答案 1 :(得分:1)

无法从群集外部直接访问Datanode,它位于专用网络中。 Hadoop集群容易出现节点故障,NameNode会跟踪不同DataNode上的所有数据。因此,群集的任何查询都由NN解决,它在DN上提供块地址。