- HDFS 是一个主从 Master/Slave 架构
- 一个 HDFS 集群包含一个 NameNode,这是一个 Master Server,用来管理文件系统的命名空间,以及协调客户端对文件的访问
- 一个 HDFS 集群包含多个 DataNode,用来存储数据
- HDFS 会对外暴露一个文件系统命名空间,并允许用户数据以文件的形式进行存储
- 在内部,一个文件被分成多个块并且这些块被存储在一组 DataNode 上
NameNode
- 文件的元数据采用集中式存储方案存放在 NameNode 当中
- NameNode 负责执行文件系统命名空间的操作,如打开、关闭、重命名文件和目录
- NameNode 同时也负责将数据块映射到对应的 DataNode 中
DataNode
- DataNode 是文件系统的工作结点
- DataNode 根据需要存储并检索数据块,并且定期向 NameNode 发送他们所存储的块的列表
- 文件数据块本身存储在不同的 DataNode 当中,DataNode 可以分布在不同机架上
- DataNode 负责服务文件系统客户端发出的读/写请求
- DataNode 同时也负责接收 NameNode 的指令来进行数据块的创建、删除和复制
Client - HDFS 的 Client 会分别访问 NameNode 和 DataNode 以获取文件的元数据信息及真实数据内容
- HDFS 集群的 Client 将直接访问 NameNode 和 DataNode,相关数据会直接从 NameNode 或者 DataNode 传送到客户端;
NameNode 和 DataNode 都是被设计为在普通 PC 上运行的软件程序 - HDFS 是用 Java 语言实现的,任何支持 Java 语言的机器都可以运行 NameNode 或者 DataNode
- Java 语言本身的可移植性意味着 HDFS 可以被广泛地部署在不同的机器上
- 一个典型的部署就是,集群中的一台专用机器运行 NameNode,集群中的其他机器每台运行一个 DataNode 实例
- 该架构并不排除在同一台机器上运行多个 DataNode 实例的可能,但在实际的部署中很少会这么做;
单一 NameNode 的设计极大地简化了集群的系统架构,它使得所有 HDFS 元数据的仲裁和存储都由单一 NameNode 来决定,避免了数据不一致性的问题
HDFS 数据复制
HDFS 可以跨机架、跨机器,可靠地存储海量文件。
HDFS 把每个文件存储为一系列的数据块,除了最后一个数据块以外,一个文件的所有数据块都是相同大小的。
HDFS 为了容错,一个文件的数据块会被复制。对于每个文件来说,文件块大小和复制因子都是可配置的。应用程序可以声明一个文件的副本数。复制因子可以在文件创建时声明,并且可以在以后修改。
通用场景下,当复制因子是 3 时,HDFS 的放置策略:
- 副本1放在本地机架的某个结点上
- 副本2放在本地机架的不同结点上
- 副本3放在不同机架的不同结点上
上述策略的优点:
- 该策略并不影响数据可靠性和可用性,因为机架不可用的概率要比结点不可用的概率低很多.
- 该策略与把3个副本放在3个不同机架上的策略相比,减少了机架之间的写操作,从而提升了写性能.
- 该策略减少了读取数据时的聚合网络带宽,毕竟一个数据块是放置在2个不同的机架上,而不是 3 个.
上述策略的缺点:
该策略没有均匀地分布副本,三分之二的副本在一个机架上,另三分之一的副本分布在其他机架上.
NameNode和DataNode的关系
-
NameNode 控制所有的数据块的复制决策,如下图所示:
它周期性地从集群的 DataNode 中收集心跳和数据块报告:
收集到心跳意味着 DataNode 正在正常提供服务
收集到的数据块报告会包含相应 DataNode 上的所有数据块列表 -
DataNode主动发送心跳:
当一切运行正常时,DataNode 会周期性发送心跳信息给 NameNode(默认是每 3 秒钟一次). -
NameNode主动监测心跳:
如果 NameNode 在约定的时间内没有收到心跳信息(默认是 10 分钟);
会认为 DataNode 出现了问题,就会把该 DataNode 从集群中移除,并且启动一个进程去恢复数据. -
DataNode节点挂掉的影响:
DataNode 脱离集群的原因有多种:如硬件故障、主板故障、电源老化和网络故障等.
- 对于 HDFS 来说,丢失一个 DataNode 意味着丢失了存储在它的硬盘上的数据块的副本.
- 假如在任意时间总有超过一个副本存在,故障将不会导致数据丢失;
当一个硬盘故障时,HDFS 会检测到存储在该硬盘上的数据块的副本数量低于要求,然后主动创建需要的副本,以达到满副本数状态.
机架感知
机架感知的概念:
告诉Hadoop,集群中哪台机器属于哪个机架
机架感知的目的:
- 作业计算本地化
- 正确执行副本放置策略
机架感知的配置:
默认情况下,Hadoop机架感知是没有启用的,需要在NameNode机器的core-site.xml里配置一个选项:
<property> <name>topology.script.file.name</name><value>/path/to/script脚本</value>
</property>
这个配置选项的value指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。
接受参数—datanode机器的ip地址.
输出的值—该ip地址对应的datanode所在的rackID,例如"/rack1".
NameNode启动时,会判断该配置选项是否为空–如果非空,则表示已经启用机架感知的配置:
此时namenode会根据配置寻找该脚本,并在接收到每一个datanode的心跳时,
将该datanode的ip地址作为参数传给该脚本运行,并将得到的输出作为该datanode所属的机架,保存到内存的一个map中.