概述
HDFS是Hadoop应用程序使用的主要分布式存储系统。 HDFS集群主要由一个NameNode来管理文件系统元数据和一些DataNodes存储实际的数据。HDFS架构图描述了NameNode,DataNode和客户端之间的基本交互。客户请求NameNode进行文件元数据或文件修改,并请求DataNodes执行实际的文件I / O。
以下是一些突出特征。
- HDFS是非常适合于使用廉价的商用硬件的分布式系统。它容错,易扩展。MapReduce也是Hadoop的一个组成部分,它简明易用且适用于大型分布式应用程序,。
- HDFS是高度可配置的,默认配置非常适合许多安装。大多数情况下,配置需要仅针对非常大的集群进行调整。
- Hadoop是用Java编写的,在所有主要平台上都支持。
- Hadoop支持类shell命令直接与HDFS进行交互。
- NameNode和Datanodes内置了Web服务器,可以方便地检查集群的当前状态。
- 在HDFS中经常发布新功能并不断改进
- 文件权限和身份验证。
- 机架:在调度任务和分配存储时考虑节点的物理位置。
- Safemode:维护的管理模式。
- fsck:用于诊断文件系统运行状况的程序,以查找丢失的文件或块。
- fetchdt:一个用于获取DelegateToken并将其存储在本地系统上的文件中的实用程序。
- 平衡器:数据在DataNodes之间不均匀分布时平衡集群的工具。
- 升级和回滚:软件升级后,如果出现意外问题,可以在升级之前回滚到HDFS状态。
- Secondary NameNode:执行命名空间的定期检查点,并帮助限制HDFS修改日志文件的大小。
- 检查点:定期执行命名空间的检查,并最小化HDFS更改日志的大小。替换先前Secondary NameNode的角色。如果没有备份节点注册到系统,NameNode允许多个Checkpoint节点同时进行。
- 备份节点:Checkpoint节点的扩展。除了检查点之外,它还从NameNode接收edits,并在内存中维护其自己的命名空间,该副本始终与活动的NameNode命名空间状态同步。一次只能有一个备份节点注册到NameNode。
Web页面
每个NameNode和DataNode内部都运行一个Web服务器,以显示集群当前的状态信息。默认配置下,NameNode首页是
http://namenode-name:50070/。它列出了集群中的DataNodes和集群的基本统计信息。 Web页面也可以浏览文件系统。
Shell命令
Hadoop支持与HDFS文件系统直接交互的各种shell命令。bin/hdfs dfs -help列出了Hadoop shell支持的命令。此外,命令bin / hdfs dfs -help command-name显示该命令详细帮助。这些命令支持大多数正常的文件系统操作,如复制文件,更改文件权限等。bin/hdfs dfsadmin命令支持几个与HDFS管理相关的操作。 bin/hdfs dfsadmin -help命令列出了当前支持的所有相关命令
Secondary NameNode
NameNode将对文件系统的修改追加到本地的日志文件(edits)中。当NameNode启动时,它从fsimage文件中读取HDFS状态,并处理edits日志文件。然后将新的HDFS状态写入fsimage,并清空空的edits文件,最后启动正常操作。由于NameNode仅在启动期间合并fsimage和edits文件,在繁忙的群集中,edits文件文件可能会随着时间的推移而变得非常大。这会导致下次重新启动NameNode需要更长时间。
Secondary NameNode 定期合并fsimage和edits文件,并将edits大小保留在限制内。它通常在与主NameNode不同的机器上运行,因为其内存要求与主NameNode相同。
Secondary NameNode上的检查点进程由两个配置参数控制。
- dfs.namenode.checkpoint.period,默认设置为1小时,指定两个连续检查点之间的最大延迟
- dfs.namenode.checkpoint.txns,默认设置为100万,定义NameNode上的未检查点事务数,将强制执行紧急检查点,即使尚未达到检查点周期。
Secondary NameNode最新的检查点存储目录与主NameNode的目录结构相同。因此,如果必要,检查指向的快照可以随时被主NameNode读取。
检查点
NameNode使用两个文件保留其命名空间:fsimage:它是命名空间的最新检查点;edits,自检查点以来的命名空间更改的日志(日志)。当NameNode启动时,它会合并fsimage和edits,以提供文件系统元数据的最新快照。 NameNode用新的HDFS状态覆盖fsimage并开始一个新的eidts。
检查点(Checkpoint)节点定期创建命名空间的检查点。它从活跃的NameNode下载fsimage和edits,将其在本地合并,并将新快照上传回活跃的NameNode。 Checkpoint节点通常在与NameNode不同的机器上运行,因为它的内存要求与NameNode相同。 Checkpoint节点由配置文件中指定的节点上运行bin/hdfs namenode -checkpoint启动。
Checkpoint(或Backup)节点及其附带的Web界面的位置通过
dfs.namenode.backup.address和
dfs.namenode.backup.http-address配置变量进行配置。
Checkpoint节点上的检查点进程的开始由两个配置参数控制。
- dfs.namenode.checkpoint.period,默认设置为1小时,指定两个连续检查点之间的最大延迟
- dfs.namenode.checkpoint.txns,默认设置为100万,定义NameNode上的未检查点事务数,将强制执行检查点,即使尚未达到检查点周期。
可以在集群配置文件中指定多个检查点节点。
备份节点
备份节点提供与检查点节点相同的检查点功能,并维护始终与活跃NameNode状态同步的文件系统。随着从NameNode接受edits日志流并将其持续到磁盘,Backup节点也将这些edits应用于中自己的内存,从而创建命名空间的备份。
备份节点不需要像如Checkpoint节点或Secondary NameNode那样,从活动的NameNode下载fsimage和edits文件。它的内存中已经具有最新的文件系统命名空间。备份节点的检查进程更高效,因为它只需要将命名空间保存到本地fsimage文件中并重置edits。
由于备份节点在内存中维护命名空间的副本,因此其RAM要求与NameNode相同。
NameNode一次支持一个备份节点。如果备份节点正在使用中,则不会注册检查点节点。将来会支持同时使用多个备份节点。
备份节点的配置方式与Checkpoint节点相同。它以bin/hdfs namenode -backup开头。备份节点及其附带的Web界面的位置通过
dfs.namenode.backup.address和
dfs.namenode.backup.http-address配置变量进行配置。
使用备份节点提供不带持久存储就运行NameNode的功能,将所有命名空间的状态委托给Backup节点。为此,可以使用-importCheckpoint选项启动NameNode,并且不为NameNode配置指定参数为dfs.namenode.edits.dir的持久性存储目录。
导入检查点
如果其他的副本和edits都丢失了,可以导入最新的检查点信息到NameNode。
- 创建一个空目录,在dfs.namenode.name.dir中配置;
- 在配置
- dfs.namenode.checkpoint.dir中指定检查点目录的位置;
- 使用-importCheckpoint选项启动NameNode。
NameNode将从
dfs.namenode.checkpoint.dir目录上传检查点,然后将其保存到dfs.namenode.name.dir中设置的NameNode目录中。 NameNode验证
dfs.namenode.checkpoint.dir中的映像是否一致,但不会以任何方式进行修改。
平衡器
HDFS数据可能并不总是均匀地放在DataNode上。一个常见的原因是向现有集群添加新的DataNode。在放置新的块(文件数据被存储为一系列块)时,NameNode在选择DataNode之前会有考虑各种考虑:
- 将块的一个副本保留在与正在写入块的节点相同的节点上。
- 需要将另一个副本传到另外的机架上,以便集群可以在整个机架的损失中生存。
- 其中一个副本通常放置在与节点写入文件相同的机架上,从而减少了跨机架网络I / O。
- 在集群中的DataNodes上均匀扩展HDFS数据。
由于多个竞争考虑,数据可能不会均匀放置在DataNodes之间。 HDFS为管理员提供了一个平衡器工具,用于分析块放置位置,并可以跨DataNode重新分配数据。
机架
通常,大型Hadoop集群安排在机架中,并且在同一机架中的不同节点之间的网络通信比机架间的网络通信更为理想。此外,NameNode尝试将块的副本放在多个机架上,以提高容错能力。 Hadoop允许集群管理员配置
net.topology.script.file.name来确定节点所属的机架。配置此脚本后,每个节点运行脚本来确定其机架ID。
安全模式 Safemode
在启动期间,NameNode从fsimage和编辑日志文件加载文件系统状态。然后,它等待DataNodes报告数据块,以使其不会过早地开始复制,尽管集群中已经存在足够的副本。在此期间,NameNode保持在Safemode中。 NameNode的Safemode本质上是HDFS集群的只读模式,它不允许对文件系统或块进行任何修改。 DataNode通常报告大多数文件系统块可用后,NameNode将自动离开Safemode。如果需要,可以使用bin/hdfs dfsadmin -safemode命令明确地将HDFS置于Safemode。 NameNode首页显示Safemode是开或关。
fsck
HDFS支持fsck命令来检查各种不一致。 它是为报告各种文件的问题而设计的,例如,文件的数据块丢失或某些块未被复制。 与传统的本地文件系统fsck程序不同,此命令无法更正其检测到的错误。 NameNode通常会自动更正大部分可恢复的故障。 默认情况下,fsck忽略打开的文件,但提供了一个选项来在报告期间选择所有文件。 HDFS fsck命令不是Hadoop shell命令。 可以使用bin/hdfs fsck运行。sck可以在整个文件系统或文件的子集上运行。