1、前言
本文写于2018年02月份,以当前HDFS版本2.9.0为主,主要参考为官方文档,其中加入了一些自己的理解,如有不对之处,还请多多指教,感谢!
HDFS既可以作为Hadoop集群的一部分,也可以作为独立的通用分布式文件系统来使用。虽然HDFS可以在多环境中轻松简单的运行起来,但是去了解一些HDFS的知识,可以极大地帮助您在集群上进行配置、调优和诊断。
2、概览
HDFS是Hadoop主要使用的分布式存储。一个HDFS集群,主要由管理文件系统元数据的NameNode和存储实际数据的DataNode组成。在上一篇文章中已经介绍了HDFS的架构。这一篇,主要介绍普通用户和管理员如何使用和管理HDFS群集。HDFS架构图中介绍了NameNode,DataNode和客户端之间的一些基本交互流程。客户首先从NameNode获取文件元数据信息,然后直接在DataNode上执行实际的文件I/O操作。
以下是HDFS的一些显着特性:
Hadoop平台,包括HDFS组件,是非常适合运行在普通的商用硬件上的,来进行分布式存储和计算。它具有很高的容错性,可扩展性。其中, MapReduce以其简单和适用于大数据规模的分布式处理程序而闻名,也是Hadoop不可或缺的一部分。
HDFS可配置性非常灵活,一般使用默认配置安装即可。如果是非常大的集群,才有必要去更改一些配置。
Hadoop使用Java编写,支持主流的操作系统。
Hadoop支持类似shell的命令来直接与HDFS进行交互。
NameNode和Datanodes节点内置了Web服务器,可以轻松的去检查群集的当前状态。
HDFS会定期优化和发布新功能。以下是HDFS的部分特性:
文件权限和认证。
机架感知(Rack awareness):在调度任务和分配存储时会去考虑节点的物理位置。
安全模式(Safemode):维护的管理HDFS的一种模式。
fsck命令:用于诊断文件系统健康状况的实用程序,也可以用来查找丢失的文件或块。
fetchdt命令:用于获取DelegationToken(属于HDFS安全机制的内容,做认证使用)并将其存储在本地系统文件中的实用程序。
Balancer命令:当数据不均匀分布在DataNode中时,可以使用该命令平衡集群中的数据。
升级和回滚:软件升级后,如果出现意外问题,可以回滚到HDFS之前的状态。
Secondary NameNode:对命名空间定期执行检查点操作。它可以合并NameNode的edit logs到fsimage文件中,有助于将HDFS修改日志的文件大小保持在NameNode的特定范围内。
检查点节点(Checkpoint node):定期对命名空间执行检查点操作。功能和Secondary NameNode类似。建议直接使用Checkpoint node。NameNode同时允许多个Checkpoint节点。
备份节点(Backup node):检查点节点的扩展。除了检查点功能之外,它还接收来自NameNode的实时变更数据,把它维护其自己的内存中,该副本始终与活动的NameNode保持同步。一次只能向NameNode注册一个备份节点。
3、先决条件
以下文档介绍了如何安装和设置Hadoop集群:
Single Node Setup:单节点安装步骤
Cluster Setup:适用于大型分布式集群
本文的其余部分假设用户能够安装,并且运行至少一个DataNode的HDFS。NameNode和DataNode可以在同一台物理机器上运行。
4、Web接口
NameNode和DataNode各自在嵌入了一个Web服务器,用来显示集群的基本信息,和当前的状态信息。如果使用默认配置,NameNode首页地址为:http://namenode-name:50070/
。它列出了群集中所有的DataNode解点,和群集的基本统计信息。Web界面也可用于浏览HDFS上到文件(点击NameNode首页上的“浏览文件系统”链接)。
5、Shell 命令
Hadoop包含各种类似于shell的命令,可直接与HDFS进行交互。如命令bin/hdfs dfs -help
列出了Hadoop shell所有支持的命令,命令bin/hdfs dfs -help 命令名
会显示更详细的命令帮助。这些命令包含这常用的一些文件系统操作,如复制文件,更改文件权限等。它还支持一些HDFS特殊的操作,例如更改文件的副本设置等。更多信息,请参阅File System Shell Guide指南。
DFSAdmin 命令
bin/hdfs dfsadmin
命令支持一些与HDFS管理相关的操作。 bin/hdfs dfsadmin -help
命令列出当前支持的所有命令。例如:
-report: 汇总HDFS的基本统计数据形成报告。 NameNode的Web页上也提供了这些信息中的一部分。
-safemode:通常不需要执行这个命令,执行此命令可以离开安全模式。
-finalizeUpgrade: 删除上次升级期间所做群集所做的备份
-refreshNodes: 更新Datanode连接。默认情况下,Namenodes会重新读取文件dfs.hosts、dfs.hosts.exclude中的数据节点主机列表。dfs.hosts中定义是集群数据节点。如果dfs.hosts中存在记录,则只允许记录中的主机注册namenode到。 dfs.hosts.exclude中的条目是需要下线的datanode。同时,如果参数
dfs.namenode.hosts.provider.classname
设置为org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager
,则在由dfs.hosts定义的JSON文件中指定所有包含和排除主机。 当节点上所有副本数据都复制到其他节点时,Datanodes才会完成停用。 下线的节点不会自动关闭,也不会再写入新副本。-printTopology :打印群集的拓扑图。以树形的方式,显示集群的机架和节点列表。
关于命令的更多用法,参考链接dfsadmin.
6、Secondary NameNode
NameNode会去记录HDFS文件修改的记录,并记录到本地文件系统edits文件中。当NameNode启动时,它会从fsimage映像文件中去读取HDFS状态、应用edits日志文件中的操作记录。然后将新的HDFS状态写入fsimage文件中,最后使用空的edits文件开始进行正常的操作。由于NameNode仅在启动时,对fsimage和edits进行合并操作,edits文件可能会在繁忙的群集上随着时间变得越来越大。不好之处是下次重新启动NameNode需要花费更长的时间来进行合并操作。
基于上述原因,secondary NameNode的作用是,通过启动一个检查点(Checkpoint)的进程,去定期合并fsimage和edits文件,并将edits文件大小保持在限制范围内。它通常在与主NameNode不同的机器上运行,因为它同样对机器内存有一定的要求。
Secondary NameNode上的Checkpoint进程的启动,是由两个配置参数控制的:
dfs.namenode.checkpoint.period:默认设置为1小时来指定两个检查点之间的最大间隔时间
dfs.namenode.checkpoint.txns:默认设置为100万,在距上一次检查点之后,还未做checkpoint事务数量,这是强制紧急检查点,即使
dfs.namenode.checkpoint.period
中设置的间隔时间还没有达到。
secondary NameNode将最新的检查点存储在与主NameNode相同的目录中。这样检查点点映像文件(fsimage)总是可以随时被NameNode读取。
secondary NameNode相关命令用法,请参阅secondarynamenode。
7、检查点节点(Checkpoint Node)
NameNode使用两个文件来保存它的命名空间:fsimage(包含着上一次检查点的namespace信息和edits操作信息) 和edits日志(上一次检查点之后的新记录)。当NameNode启动时,它会去合并fsimage和edits日志,得到最新的文件系统元数据。启动之后,NameNode用新的HDFS状态覆盖fsimage文件,并将后续操作记录到新的edits日志文件中。
检查点节点(Checkpoint Node)定期对命名空间(namespace)生成检查点。它从活动的NameNode(active NameNode)上下载fsimage和edits日志到本地进行合并,并将新合并的映像(image )上传回活动的NameNode上。 它通常在与主NameNode运行在不同的机器上,因为它同样对机器内存有一定的要求。如果需要启动检查点节点,首先在配置文件中指定的节点,然后执行bin/hdfs namenode -checkpoint
即可。
Checkpoint(或Backup)节点及其相应的Web界面,可以通过dfs.namenode.backup.address
和dfs.namenode.backup.http-address
进行配置。
Checkpoint node节点上的Checkpoint进程的启动,是由两个配置参数控制的:
dfs.namenode.checkpoint.period:默认设置为1小时来指定两个检查点之间的最大间隔时间
dfs.namenode.checkpoint.txns:默认设置为100万,在距上一次检查点之后,还未做checkpoint事务数量,这是强制紧急检查点,即使
dfs.namenode.checkpoint.period
中设置的间隔时间还没有达到。
Checkpoint node将最新的检查点存储在与主NameNode相同的目录中。这样检查点点映像文件(fsimage)总是可以随时被NameNode读取。
可以在群集配置文件中指定多个检查点节点。
Checkpoint Node相关命令用法,请参阅namenode。
8、备份节点(Backup Node)
备份节点提供与检查点节点功能类似,都有执行检查点的方法,以及在内存中维护着一份,始终与活动NameNode状态同步的命名空间文件的最新副本。除了接受来自活动NameNode的edits日志流,并将其保存到磁盘之外,备份节点还将这些日志应用到它自己的内存中的命名空间的副本中,从而去创建命名空间的备份。
备份节点不需要从活动的NameNode下载fsimage和edits文件,用来创建检查点。只有Checkpoint Node或Secondary NameNode会需要这些文件,因为它已经有一份最新的命名空间数据在内存中。Backup node的检查点进程效率更高,因为它只需将命名空间的数据保存到本地的fsimage文件上,并重置edits文件。
由于备份节点在内存中维护命名空间的副本,因此其内存要求与NameNode相同。
NameNode一次只支持一个备份节点。如果正在使用备份节点,则不会注册任何检查点节点(Checkpoint nodes)。将来会支持同时使用多个备份节点。
备份节点的配置方式与检查点节点相同。执行bin/hdfs namenode -backup
启动。
备份(或检查)节点及其附带的Web界面的位置通过dfs.namenode.backup.address
和dfs.namenode.backup.http-address
参数,进行配置。
使用备份节点后,提供了一种运行NameNode但不使用持久性存储(设备断电后保留数据,有时被称为非易失性存储器。)的选择,备份节点承担着持久化命名空间状态的任务。如果有这样的场景,使用-importCheckpoint
选项来启动NameNode,并在namenode配置中,不配置dfs.namenode.edits.dir
参数的持久化存储目录。
有关创建备份节点和检查点节点的的完整讨论,请参阅HADOOP-4539。有关命令的用法,请参阅namenode。
9、导入检查点
如果NameNode的fsimage和edits日志都丢失了,可以将最新的检查点数据导入到NameNode中。为了做到这一点,应该:
在参数
dfs.namenode.name.dir
中配置变量,指定一个空目录(需要提前创建好);在参数
dfs.namenode.checkpoint.dir
中指定检查点目录位置;最后使用
-importCheckpoint
选项来启动NameNode。NameNode将从
dfs.namenode.checkpoint.dir
目录中上传检查点的数据,然后将其保存到NameNode的dfs.namenode.name.dir
的目录中。如果dfs.namenode.name.dir目录中,已经存在一个合法的映像文件,则NameNode将会启动失败。 NameNode会去验证dfs.namenode.checkpoint.dir
、dfs.namenode.name.dir
中的映像文件是否一致,但不会修改它。有关命令的用法,请参阅namenode。
10、平衡(Balancer)
HDFS数据可能并不总是均匀的分散在DataNode中。一个常见的原因是,新的DataNode添加到现有群集中。在放置新块(一组数据文件称为块)时,NameNode会根据各种参数去选择,用哪个来进行DataNode接收。其中一些考虑因素是:
如果一个节点正在写入块,那么这个块的副本会有一个,和它在同一个节点上
需要在机架上复制分散不同的副本,以便群集可以在整个机架出现故障的情况下,依然可用。
副本中,通常有一个副与写入文件的节点放在同一个机架上,以便减少跨机架网络I/O。
将HDFS数据统一分布在集群中的DataNode中。
由于会出现多种因素,数据可能不会均匀的分散在DataNodes中。 HDFS为管理员用户提供了一个工具,用于分析整个集群数据数据节点上的数据块分散情况,和数据平衡的功能。
数据平衡(balancer)使用指南,请参考HADOOP-1652。
11、机架感知(Balancer)
HDFS群集可以识别放置每个节点的机架的架构。为了优化数据容量和使用率,配置好集群的架构非常重要。更多详细信息,请查看rack awareness文档。
12、安全模式(Safemode)
在启动期间,NameNode从fsimage和edits日志文件中加载文件系统状态。即使群集中已经存在足够的副本,它也会去等待DataNodes报告数据块(blocks)的信息,以便它不会过早地开始复制块。在此期间,NameNode进入安全模式。NameNode的安全模式本质上是HDFS群集的只读模式,它不允许对文件系统或块进行任何修改操作。通常,NameNode会在DataNodes报告大多数文件系统块可用后,自动离开Safemode模式。如果有需要,可以使用bin/hdfs dfsadmin -safemode
命令显式地将HDFS置入安全模式。NameNode的Web首页会显示Safemode是打开还是关闭。更详细的信息,请查看JavaDoc for setSafeMode()
。
13、fsck命令
HDFS可以使用fsck
命令来检查集群中各种不一致情况。它可以报告各种文件的问题,例如,缺少文件块或未复制块。与原生文件系统的fsck
命令不同,此命令不会自行更正它检测到的错误。通常NameNode会自动修复大部分可恢复的故障。默认情况下,fsck会忽略打开的文件,但会提供一个选项来告知用户。 HDFS fsck
命令不在Hadoop shell
命令范围内。通过执行命令bin/hdfs fsck
来运行。有关命令用法,请参阅fsck。 fsck可以在整个文件系统或文件的子集上运行。
14、fetchdt命令
HDFS可以使用fetchdt
命令来获取授权令牌(Delegation Token)并将其存储在本地系统的文件中。此令牌稍后可用于从非安全客户端访问安全的服务器(例如NameNode)。如果程序要使用RPC或HTTPS(通过Kerberos)获取令牌,Kerberos票据必须在运行前就已经存在(运行kinit
命令以获取票据)。HDFS fetchdt
命令不在Hadoop shell
命令范围内。通过执行命令bin/hdfs fetchdt DTfile
来运行。获得令牌之后,无需Kerberos票据就可以运行HDFS的命令,将HADOOP_TOKEN_FILE_LOCATION
环境变量指向令牌文件即可。更多用法,请参阅fetchdt。
15、恢复模式(Recovery Mode)
通常情况下,可以配置多个元数据存储位置。如果一个存储位置损坏,则可以从其他存储位置来读取元数据。
但是,如果可用的唯一存储位置也损坏了,那么在这种情况下,有一种称为恢复模式(Recovery mode)的特殊NameNode启动模式,可以让您恢复大部分数据。
启动NameNode时,通过:namenode -recover
来进入恢复模式。
当处于恢复模式时,NameNode将在命令行中交互式地提示您可以采取哪些措施恢复数据。
如果您想跳过提示,可以加上-force
选项。该选项将强制恢复模式始终选择第一个选项。通常情况下,这也是最合理的选择。
由于恢复模式会导致数据丢失,因此在使用之前,需要备份好edit日志和fsimage文件。
16、升级和回滚
当Hadoop在现有集群上进行升级时,与任何软件升级一样,可能会出现新的错误或不兼容的问题,这些问题会影响现有的程序,而且出现的问题可能是以前未发现到的。HDFS升级安装,或者重新开始启动HDFS,都不允许出现数据丢失的情况。HDFS允许管理员会退到早期版本的Hadoop版本,并将群集回滚到升级前的状态。在Hadoop Upgrade Wiki页面中更详细地介绍了HDFS升级的步骤。 HDFS只能有一个备份。在升级之前,管理员需要使用bin/hadoop dfsadmin -finalizeUpgrade
命令删除现有备份。以下简要介绍典型的升级过程:
在升级Hadoop之前,确认集群是否已经存在备份。
停止集群并分发新版本的Hadoop软件。
使用
-upgrade
选项运行新版本的Hadoop(bin/start-dfs.sh -upgrade
)。大多数时候,群集运行正常。一旦新的HDFS被认为运行良好(可能是在运行几天后),最终确定升级。请注意,在群集完成升级之前,删除文件不会释放DataNode上的磁盘空间。
- 如果需要回退到旧版本,
- 停止集群并分发早期版本的Hadoop软件。
- 在namenode上运行rollback命令(
bin hdfs namenode -rollback
)。 - 使用回滚选项来启动集群。 (
sbin/start-dfs.sh -rollback
)。
升级到HDFS的新版本时,有必要重命名或删除旧版本中的目录。如果NameNode在升级过程中遇到目录已存在,它将打印如下所示的错误:
/.reserved is a reserved path and .snapshot is a reserved path component in this version of HDFS. Please rollback and delete or rename this path, or upgrade with the -renameReserved [key-value pairs] option to automatically rename these paths during upgrade.
指定-upgrade -renameReserved
[可选的键值对]后,NameNode将自动重命名启动期间找到的任何旧版本的目录。例如,将.snapshot的所有路径重命名为.my-snapshot并将.reserved重命名为.my-reserved,用户可以指定-upgrade -renameReserved .snapshot = .my-snapshot,.reserved = .my-reserved。
如果没有使用-renameReserved
指定键值对,那么NameNode将后缀为.<LAYOUT-VERSION> .UPGRADE_RENAMED
的保留路径,例如, .snapshot.-51.UPGRADE_RENAMED
。
重命名过程中有一些注意事项。如果可能的话,建议在升级之前执行hdfs dfsadmin -saveNamespace
命令操作。这么做是因为如果edits日志操作引用自动重命名文件,则可能会导致集群内数据不一致。
17、DataNode热插拔
Datanode支持热插拔驱动器。用户可以在不关闭DataNode的情况下添加或替换HDFS数据盘。以下简要介绍一个热插拔的流程:
如果有新的数据盘,先进行格式化并挂载。
更新DataNode的配置,在
dfs.datanode.data.dir
参数中,新增数据目录。运行
dfsadmin -reconfig datanode HOST:PORT start
命令,使用新的配置进行启动。用户可以使用dfsadmin -reconfig datanode HOST:PORT status
命令来查询重新配置后的运行状态。重新配置任务完成后,用户可以安全的卸载其他不需要的数据卷目录并物理删除磁盘。
18、文件权限和安全
HDFS的文件权限的设计与其他熟悉的平台(如Linux)上的文件权限类似。目前,安全性设置通过简单的文件权限来实现的。启动NameNode的用户被视为HDFS的超级用户。后续到HDFS版本将支持通过Kerberos等网络认证协议来进行用户认证和数据传输加密。
19、可扩展性
Hadoop当前可以运行在有数千个节点的群集上。 PoweredBy Wiki页面列出了一些在使用了大型Hadoop集群的组织。由于HDFS每个集群只有一个NameNode,集群主要的可伸缩性限制是NameNode机器上的可用内存。在非常大的群集上,增加HDFS中存储的文件的平均大小有助于增加群集的可扩展性,而不会增加NameNode上的内存要求。默认配置可能不适合非常大的群集。 FAQ Wiki页面列出了针对大型Hadoop集群的优化和建议配置。
20、相关文档
在开始使用HDFS时,阅读这份文档是一个很好的开始。在该指南不断完善的同时,还有大量有关Hadoop和HDFS的文档。以下列表您还可以继续探索HDFS的世界:
Hadoop Site: Apache Hadoop站点的主页。
Hadoop Wiki:Hadoop Wiki主要。与Hadoop源代码一起发布的文档不同,Hadoop Wiki定期由Hadoop社区进行维护。
FAQ:FAQ Wiki页面。
Hadoop User Mailing List:Hadoop邮件列表user[at]hadoop.apache.org.
hdfs-default.xml。该页面介绍了hdfs中的变量和默认参数配置。
HDFS Commands Guide: HDFS命令的用法。