HDFS 架构
Hadoop HDFS是一个主从(Master / Slave)架构,其中Master是Namenode节点,它主要用来存储元数据,Slave是Datanode节点,用来存储实际业务数据的节点。HDFS架构用一个Namenode和多个Datanode组成。
下面详细介绍HDFS里面的各个部分。
HDFS NameNode
Namenode其实就是Master节点,它主要用来存储元数据,比如数据块的数量,副本和其他细节。这些元数据是存储在Master节点的内存里面的,因为要保证元数据的快速查询。另外还会在磁盘(FsImage文件和Editlog文件)保存一份元数据镜像文件。Namenode维护和管理Slave节点,并且给他们分配任务。由于NameNode是整个HDFS集群的中心,所以最好把它部署在可靠的硬件机器上。
Namenode主要负责以下任务:
- 管理文件系统命名空间
- 规范客户端文件访问权限
- 执行文件系统相关的操作,如关闭,打开文件/目录,以及给文件/目录命名。
- 所有的datanode都会给Namenode发送心跳和块信息报告。心跳用来检测 Datanode是否处理正常状态。块信息报告是datanode上所有块信息的列表。
- Namenode还负责处理所有块的副本因子。
Namenode主要维护两个文件,一个是FSImage,一个是EditLog。
FsImage
FsImage是一个“镜像文件”。它保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。
EditLog
EditLog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。
HDFS DataNode
DataNode即Slave节点,它是实际存储业务数据的节点。它会按照客户端的请求执行数据读写操作。DataNode可以部署在商用硬件上。
Datanode主要负责以下工作:
- 根据Namenode指令创建、删除和复制数据块。
- Datanode管理系统的数据存储。
- Datanode定期给Namenode发送心跳告知自身的健康状态,默认3秒发送一次心跳。
SecondaryNameNode
SecondaryNameNode是一个辅助的NameNode,不能代替NameNode。它的主要作用是用于合并FsImage和editlog文件。在没有SecondaryNameNode守护进程的情况下,从namenode启动开始至namenode关闭期间所有的HDFS更改操作都将记录到editlog文件,这样会造成巨大的editlog文件,所带来的直接危害就是下次启动namenode过程会非常漫长。
在启动SecondaryNameNode守护进程后,每当满足一定的触发条件(每3600s、文件数量增加100w等),SecondaryNameNode都会拷贝namenode的fsimage和editlog文件到自己的目录下,首先将fsimage加载到内存中,然后加载editlog文件到内存中合并fsimage和editlog文件为一个新的fsimage文件,然后将新的fsimage文件拷贝回namenode目录下。并且声明新的editlog文件用于记录DFS的更改。
Checkpint Node和Backup Node
Checkpoint Node会通过单独线程,定时从Active NameNode拉取edit log文件拷贝到本地,并且将这些edit log在自己内存中进行重演。如果checkpoint条件具备,将进行checkpoint操作,文件存入本地,并通过HTTP PUT的方式将fsimage文件传输给Active NameNode。
Backup Node除了具有Checkpoint Node的上述所有功能外,还会通过RPC方式(属于stream的方式,区别于单独定时拷贝)实时接收Active NameNode的edit操作。因此,同Checkpoint Node相比,Backup Node的内存映象在时间差上几乎与Active NameNode一致。
注意:Checkpoint Node和Backup Node在某种程度上几乎替代了Standby NameNode的功能,因此,在HA模式下,无法启动Checkpoint Node和Backup Node。必须使用非HA模式才可以启动并使用Checkpoint Node。
HDFS 块概念
HDFS会把大文件分割成小的的数据块,它是Hadoop分布式文件系统最小的数据存储单位。数据块的存储位置由Namenode决定。默认的HDFS数据块大小是128MB,我们可以根据需要调整块大小。文件分割后所有的块大小都是一样的,除了最后一个块,默认情况下,它的大小可能小于等于128MB。如果文件的数据量比块小,那么块的容量将等于文件数据量大小。比如文件是129MB,那么HDFS会创建2个块,一个是128MB,一个将是1MB,而不是128MB。
副本管理
块副本给HDFS提供了很好的数据容错特性。如果一个副本损坏了,我们可以从其他节点读取到该副本。HDFS里面块的副本数量叫做副本因子,默认情况下,副本因子是3,可以在配置文件hdfs-site.xml修改这个值。所以每个块会被复制3次,并存储在不用的datanode磁盘上。如果需要把128M的文件存储在HDFS上,那么需要384MB的存储空间(128MB * 3)。
Namenode定期接收来自Datanode的块信息报告来维护副本因子。如果块副本数量比副本因子大,Namenode会删除多余的块副本,相反,Namenode将会新增块副本。
HDFS机架感知
在大型Hadoop集群,为了在读写文件的时候改善网络传输,Namenode会选择给同一个机架或者最近的机架上的Datanode发送读写请求。NameNode通过维护每个DataNode的机架id来获取机架信息。HDFS机架感知就是基于机架信息选择Datanode的过程。
在HDFS架构里面,Namenode需要确保所有的块副本不能存储在同一个机架上。它根据机架感知算法减少延迟时间和容错。我们知道默认副本因子是3,根据机架感知算法,第一个块副本将存储在本地机架,第二个副本存储在同一个机架的不同节点,第三个将存储在另一个机架上。
机架感知对以下几点的改善非常重要:
- 提升数据的高可用和可靠性。
- 改善集群性能。
- 改善网络带宽。
HDFS读写操作
写操作
当客户端想把文件写入到HDFS的时候,为了获取元数据,它必须先给namenode发送请求。Namenode会返回元数据信息(如块数量、块位置等数据块元数据),基于Namenode提供的信息,客户端把文件分割成若干个数据块。之后开始把数据块发送给第一个Datanode。
客户端先把block A发送给Datanode1,Datanode1接收到block A之后,它会把block A复制到同个机架的Datanode2,由于两个Datanode位于同一个机架,数据块需要通过机架交换机传输。然后Datanode2再把数据块复制到另外一个机架的Datanode3上。当Datanode接收来自客户端的数据块的时候,它会给Namenode发送写入确认。这个过程将在文件的其他数据块重复进行。
读操作
从HDFS读取文件,也需要先从namenode获取元数据,即数据块位置、数据块数量,副本和其他细节信息。拿到元数据之后再去相应的datanode读取数据。当客户端或者应用程序接收到文件的所有块之后,它会把这些合并成原始文件的形式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论