DataNode

数据块在DN上的存储包括两部分:数据块本身、元数据(数据checksum、数据大小、时间戳)
image.png

  1. //超过10分半节点不通信 视为不可用节点。
  2. TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
  3. 默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3
  4. //hdfs-site.xml
  5. <property>
  6. <name>dfs.namenode.heartbeat.recheck-interval</name>
  7. <value>300000</value>
  8. </property>
  9. <property>
  10. <name>dfs.heartbeat.interval</name>
  11. <value>3</value>
  12. </property>
  1. //hdfs-site.xml
  2. //DN 向 NN 汇报当前块信息的时间间隔,默认 6 小时
  3. <property>
  4. <name>dfs.blockreport.intervalMsec</name>
  5. <value>21600000</value>
  6. <description>Determines block reporting interval in milliseconds.</description>
  7. </property>
  8. //DN扫描本节点块信息列表的时间间隔,默认6小时
  9. <property>
  10. <name>dfs.datanode.directoryscan.interval</name>
  11. <value>21600s</value>
  12. </property>

NameNode

作用

  1. 维护目录树,维护命名空间。
  2. 负责确定 block文件块到具体的Datanode结点的映射关系。
  3. 管理Datanode结点的状态报告

    fsimage和edits

  • fsimage是检查点,是目录树,但是没有块对应的datanode信息(因为datanode会汇报块信息,namenode再把 block -> datanodes list 存储在BlocksMap的数据结构中)
  • edits是操作日志

SecondaryNamenode

作用

1、帮助namenode合并 edits生成fsimage
image.png

  1. //hdfs-site.xml
  2. //每小时执行一次合并
  3. <property>
  4. <name>dfs.namenode.checkpoint.period</name>
  5. <value>3600s</value>
  6. </property>
  7. //或操作次数达到100万执行一次合并
  8. <property>
  9. <name>dfs.namenode.checkpoint.txns</name>
  10. <value>1000000</value>
  11. </property>
  12. //1 分钟检查一次操作次数
  13. <property>
  14. <name>dfs.namenode.checkpoint.check.period</name>
  15. <value>60s</value>
  16. </property>

HA

要点

  • 元数据管理方式需要改变

两个namenode内存中各自保存一份元数据;
Edits日志只有Active状态的NameNode节点可以写操作;
两个NameNode都可以读取Edits;
共享的Edits放在一个共享存储中管理(journal和NFS两个主流实现);

  • 需要一个状态管理功能模块

实现了一个zkfc,常驻在每一个namenode所在的节点,每一个zkfc负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfc来负责切换,切换时需要防止brain split现象的发生。

  • 必须保证两个NameNode之间能够ssh无密码登录
  • 隔离(Fence),防止脑裂即同一时刻仅仅有一个NameNode对外提供服务

1、ssh kill
2、shell脚本(用户自定义的一个脚本是断网还是断电,在ssh kill没有成功的情况下启动)
image.png

JournalNode

JN必须是奇数个,如3、5、7、9个等等。当运行N个节点时,系统可以容忍至少(N-1)/2(N至少为3)个节点失败而不影响正常运行。
1、active状态的NameNode的edits有任何修改时,会告知大部分的JournalNodes进程。
2、standby状态的NameNode只可读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的edits
3、standby可以确保在集群出错时,命名空间状态已经完全同步了

ZKFC

zkfc是Hadoop中通过ZK实现故障自动切换的一个实用工具。
FC是要和NN一一对应的,两个NN就要部署两个FC。它负责监控NN的状态,并及时的把状态信息写入ZK
1、zkfc定期对本地的NN发起health-check的命令,如果NN正确返回,那么这个NN被认为是OK的。否则被认为是失效节点
2、active namenode失效之后,zkfc会先进行杀死本namenode操作 然后另一台zkfc会更改standby namenode状态为active