hadoop机架感知以及HDFS
HDFS副本存放策略:
- 第一个副本,在客户端相同的节点(如果客户端是集群外的一台机器,就随机选节
点,但是系统会避免挑选太满或者太忙的节点) - 第二个副本,放在不同机架(随机选择)的节点。
- 第三个副本,放在与第二个副本同机架但是不同节点上。
机架感知:
机架感知.png- distance(/D1/R1/H1,/D1/R1/H1)=0 相同的datanode
- distance(/D1/R1/H1,/D1/R1/H3)=2 同一rack下的不同datanode
- distance(/D1/R1/H1,/D1/R2/H4)=4 同一IDC下的不同datanode
- distance(/D1/R1/H1,/D2/R3/H7)=6 不同IDC下的datanode
HDFS:
HDFS由3个组件构成NameNode,SecondaryNameNode,DataNode。
NameNode:
NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。
NameNode.png
上面的这张图片展示了NameNode怎么把元数据保存到磁盘上的。这里有两个不同的文件:
fsimage - 它是在NameNode启动时对整个文件系统的快照
edit logs - 它是在NameNode启动后,对文件系统的改动序列
只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。由于在集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。由此会产生如下问题:
edit logs文件会变的很大,如何管理这个文件?
NameNode的重启时间变长?因为有很多改动序列(edit logs)要合并到fsimage文件上。
引入 SecondaryNameNode来解决。
SecondaryNameNode(检查节点):
职责是合并NameNode的edit logs到fsimage文件中。
SecondaryNameNode.png
SecondaryNameNode定时到NameNode去获取edit logs,并更新到fsimage上。(Secondary NameNode自己的fsimage),一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。
当我们往DataNode写文件时,DataNode会跟NameNode通信,告诉NameNode什么文件的第几个block放在它那里,NameNode这个时候会将这些元数据信息写到edit logs文件中。